はじめる! Squirrel 第6章 配列とテーブル

  • 配列インデックスは 0 オリジン
  • 配列には異なる型の要素を持てる
  • 配列にドット(".")をはさんで関数を書ける。メソッド呼び出しみたいですね。このドットの両側にも空白を挟むのが慣習みたい
    • len, append, insert, remove, clear, sort, reverse, resize, slice, extend, push, pop
      • だいたい字面から想像できる通りの動作。sort はコールバック用の比較関数を引数として受け付ける。extend は concatenation(2つの配列を連結)、ただし破壊的に動作します
  • テーブルは「キー」と「値」の組み合わせの集合
  • 関数を含めることもできる
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 文は配列やテーブルのほかクラス、文字列にも実行できる。配列の場合インデックスも取り出せる

テーブルの仕様では少し特徴のある部分が出てきました。