はじめる! Squirrel 第6章 配列とテーブル
- 配列インデックスは 0 オリジン
- 配列には異なる型の要素を持てる
- 配列にドット(".")をはさんで関数を書ける。メソッド呼び出しみたいですね。このドットの両側にも空白を挟むのが慣習みたい
- len, append, insert, remove, clear, sort, reverse, resize, slice, extend, push, pop
- だいたい字面から想像できる通りの動作。sort はコールバック用の比較関数を引数として受け付ける。extend は concatenation(2つの配列を連結)、ただし破壊的に動作します
- len, append, insert, remove, clear, sort, reverse, resize, slice, extend, push, pop
- テーブルは「キー」と「値」の組み合わせの集合
- 関数を含めることもできる
local empty_table = {}; local table = { a = 10 }; local function_table = { function f (arg) { return arg + 1; } }
- テーブルの要素のアクセスは [ ] とドットをはさんだ記法も可能。ここは ECMAScript っぽい
- テーブルアクセスの委譲
- テーブルには親子関係みたいなものを持たせることができ、あるテーブルに存在しないキーのアクセスを親テーブルの参照に委譲することができる
local t1 = { foo = 42 }; local t2 = delegate t1 : { bar = 72 }; print(t2.bar); // => 72 print(t2.foo); // => 42 ← t1 に委譲されてみつかる
- clone という構文(?) でコピーを作ることができるが、テーブルは Shallow Copy が行われる
- _clone というキーで関数を要素に持っておくと clone 時に呼ばれる
- テーブルへのスロットの追加は <- を使う
local t1 = {}; t1.foo <- 100;
- コラムより、グローバル変数の宣言とテーブルのスロット追加は同じ構文を使う。グローバル変数はルートテーブルへのスロット追加として動作する。つまりルートテーブルという無名のテーブルがシステムに存在していて、グローバル変数や関数はそのスロット(と、いうことはグローバル変数と関数名は名前空間が共通)
- デーブルの要素の削除は delete 文。スロットの指定はドットを使う
delete t . k;
- in 演算子で配列やテーブル内にある要素が存在するかを判定できる。テーブルはキーで判定する
- foreach 文は配列やテーブルのほかクラス、文字列にも実行できる。配列の場合インデックスも取り出せる
テーブルの仕様では少し特徴のある部分が出てきました。