Skip to content
Silica edited this page Nov 14, 2012 · 7 revisions

#array (配列) どの様な配列に対しても、要素としてあらゆる値を格納出来る ##整数のindexを持つ配列 list = (1,"str",2,"hoge"); print(list[0]); // 1 print(list[1]); // str print(list[2]); // 2 print(list[3]); // hoge 空の変数に対してはいつでもインデックスを作成出来る

local a;
a[0] = 1;
a[1] = 4;
a[10] = "str";

要素数は自動的に拡張される

数値に対して代入すると要素数が入る

int i = list; // 上の例では4
int j = a;    // 同11

マイナスのインデックスは後ろから

list[-1] == "hoge";
a[-1] == "str";

インデックスにリストを与えることで部分配列を取り出せる

b = list[1,2];	// 1番目から2つ分
b[0] == "str";
b[1] == 2;

部分配列に対して代入することも可能

list[1,2] = ("text", 4);
list[1] == "text";
list[2] == 4;

###多次元配列 但し、ジャグ配列である

list = ((1,2),(3,4),(5,6));
list[0][0] == 1;
list[0][1] == 2;
list[1][0] == 3;
list[1][1] == 4;
list[2][0] == 5;
list[2][1] == 6;

これも特に初期化しなくてもいきなり深いところにアクセス出来る

###array型 基本組み込み要素としてarray型が予め作成される

array a = (1,2,3,4);
array b;
b[10] = 1;

カンマ区切りリストで値を代入する場合も、要素へのアクセスと拡張も
暗黙的に作成された配列と動作に違いは無いが
幾つかのメンバ関数が追加される

a.length();
a.push(v);
a.foreach(func);
a.join(separator);

尚これらは、array型のインスタンスとして作成した配列以外に対しても
array.length(list);の様に使用する事が出来る ##連想配列 連想配列もまた空の変数に対してはいつでも要素を作成する事が可能である

local a;
a["a"] = 1;
a["b"] = "str";
a["foo"] = "bar";

次の様に書くことも可能

a = [a:1, b:"str", foo:"bar"];

名前は引用符で囲ってもよい
記号をキーにする場合は必ずそうする必要がある

a = ["+++":1, "---":2, "***":3];

値は定数である必要はない
他の変数を参照することも出来る

a = [a:1+2, b:x, c:func()];

a.a = 1+2;
a.b = x;
a.c = func();

と同じと考えてよい

多次元連想配列も通常配列との混合多次元も可能

###table型 table t; t.exist("key"); t.delete("key"); k = t.keys(); t.foreach(func); keysはkeyを順に格納した通常の配列を返すが、
table型のインスタンスを作成した場合はexist、delete、keysとforeachを含んでしまう
取り除くのは簡単だが後で考える

foreachは与えた関数に対してkeyとデータのペアを順に渡して実行する

local list;
list["test"] = 1;
list["foo"] = "bar";
func(k,v) print(k + ":" + v + "\n");
k = foreach(list, func);
print("k[0] = " + k[0] + "\n");
print("k[1] = " + k[1] + "\n");

result:

test:1
foo:bar
k[0] == test
k[1] == foo

これもtable型のインスタンスではなくても

table.exist(list);
table.delete(list, key);
k = table.keys(list);
table.keys(list, func);

の様に使用可能

##その他 通常の配列と連想配列は一つの変数に対して同時に作成出来る

local list;
list[0] = 10;
list["text"] = "hoge";

index=0の値もkey="text"の値も有効である
list[1]とlist["1"]は別物である
arrayの機能とtableの機能はお互いに干渉しない
上の例でtable.exist(list, 0)はfalseだし
array.length(list)は1となる(["text"]の存在は考慮されない)

###基本組み込み関数foreach 通常配列に対してはarray.foreachの動きを
連想配列に対してはtable.foreachの動きをする
どちらも持っている場合はarrayを優先する

###おまけ 初期案では内部にそのものarrayとtableを用意したのだが
実際には何故この様(同時に両方扱える)になっているかというと

array a;
a[1] = 2;
a.length();

を無理なくやる為
お陰で空変数を作るだけで自動的に中にvectorとmapを持っているが、許せ

Clone this wiki locally