Section 1.15 辞書配列

今回は前回やった配列の仲間、辞書配列(連想配列)について。
辞書配列…ってどんな配列なの?
辞書配列は簡単に言うと、添え字が数値じゃなくて文字列になってる配列だよ。
添え字が文字列ってどういうこと?
こういうこと。

<辞書配列を使ったスクリプトの例>

var week = ["月""火""水""木""金""土"];
var d = new Date();
var dic = new Dictionary();  // 辞書配列を作ります

dic["year"] = d.getYear();
dic["month"] = d.getMonth() + 1;
dic["day"] = d.getDate();
dic["day_of_week"] = week[d.getDay()];

System.inform("今日は " + dic["year"] + " 年 " + dic["month"] + " 月 " + dic["day"] + " 日 " + dic["day_of_week"] + " 曜日です。");  // 今日の日付を表示します

ね、添え字が文字列になってるでしょ。
ほんとだ。
dic の最初の要素が "year" って名前で、その中身が getYear メソッドで取得した値になってるんだね。
それはちょっと違うんだよね。
えっ、何が違うの?
辞書配列は添え字に文字列を使ってるから、順序はないんだ。
だから最初に dic["year"] を作ったからといって、これが最初の要素ってわけじゃないんだ。
あ、そうなんだ。
うん、だから値を参照したり設定したりする時は、順番じゃなくて名前で要素を指定するんだ。
あと、辞書配列の要素の名前が変数につけられる名前だったらこんなふうに書いても OK。
変数につけられる名前については §1.3 を参照してね。

<辞書配列を使ったスクリプトの例(その2)>

var week = ["月""火""水""木""金""土"];
var d = new Date();
var dic = new Dictionary();

dic.year = d.getYear();
dic.month = d.getMonth() + 1;
dic.day = d.getDate();
dic.day_of_week = week[d.getDay()];
// dic.hr:min = d.getHours() + ":" + d.getMinutes();  // これはダメ!(dic["hr:min"]ならOK)

System.inform("今日は " + dic.year + " 年 " + dic.month + " 月 " + dic.day + " 日 " + dic.day_of_week + " 曜日です。");  // 今日の日付を表示します

なんかプロパティみたいな書き方だね。
ん、確かに書き方はプロパティと同じだね。
ところで、これって今までにも見たことない?
えっ? でも辞書配列って、今まで出てきたことなかったよね…?
じゃこれでどう?

var f = new Dictionary();

f.変数 = 1;

System.inform("変数の値は " + f.変数 + " です。");

あっ、KAG のゲーム変数だ!
そ。実は KAG のシステム変数・ゲーム変数・一時変数は全部辞書配列なんだ。
だからいちいち宣言しなくても変数が作れてたってワケ。
そうだったんだ〜。
ね、前にも見たことあったでしょ。
うん。でも全然知らなかった。
ま、KAG ではこういう事を考えなくても簡単に変数が使えるようにしてあるからね。
KAG ってすごいねぇ。
うん、ほんとよく考えて作ってあるよね。
じゃ、次は辞書配列の初期化の仕方を説明するね。
これは普通の配列と似てるけどちょっと違うんだ。

<辞書配列の初期化の例>

var dic = %["year" => 2007, "month" => 2, "day" => 27, "day_of_week" => "火"];

System.inform(dic.year + " 年 " + dic.month + " 月 " + dic.day + " 日 " + dic.day_of_week + " 曜日");

[ の前に % がついてるね。
うん。[] が普通の配列で、%[] が辞書配列ね。
あと普通の配列と違うのは、名前があることと => かな。
そ。辞書配列の場合は、要素を『名前 => 値』っていう形式で書くんだ。
へぇ、そうなんだ。
あとは…辞書配列にはプロパティはないから、辞書配列のメソッドだね。
辞書配列のメソッドって、やっぱり配列のメソッドと似てるの?
ん〜、確かに似てるね。でも、辞書配列のメソッドは配列のメソッドほど種類が多くないんだ。
それと、辞書配列のメソッドはちょっと厄介なんだよね…
えっ、どういうこと?
まぁ、とりあえず説明するね。
まずは assign メソッドから。
assign メソッドって配列の中身をコピーするメソッドだよね。
…なんでこれが厄介なの?
使い方を見ればわかると思うよ。

assign メソッドの使用例>

var dic = %["year" => 2007, "month" => 2, "day" => 27, "day_of_week" => "火"];
var copy_dic = new Dictionary();

(Dictionary.assign incontextof copy_dic)(dic);  // dic の内容を copy_dic にコピーします

なにこれ!?
copy_dic.assign(dic);』じゃないの?
残念ながら、辞書配列のメソッドは普通の配列のメソッドみたいに簡単には使えないんだ。
えっ、なんで?
Dictionary クラスのオブジェクトはメソッドを持ってなくて、 メソッドを使う時は Dictionary クラスに直接属してるメソッドを copy_dic のコンテキスト上で実行しないといけないってことになってるから。
???
って言われてもわかんないよね…
うん…
というワケで、辞書配列の場合はこういう決まったやり方があるって思うしかないね。
うん、わかった。
あとは配列の要素を全部削除する clear メソッドだけど、これもさっきと同じやり方。

clear メソッドの使用例>

var dic = %["year" => 2007, "month" => 2, "day" => 27, "day_of_week" => "火"];

(Dictionary.clear incontextof dic)();  // dic の内容を全て削除します

つまり、辞書配列のメソッドを使う時は、『(Dictionary.メソッド名 incontextof 辞書配列の名前)(引数)』って書けば OK ってこと。
あ、それなら大丈夫かも。
こう考えると、そんなに難しくないでしょ。
うん。
他のメソッドは TJS2 リファレンスの『Dictionary クラス』の項目を参照してね。
はーい。
じゃあ、今回はここまでね。
次回はいよいよ第1章最後の項目、関数について。
じゃあ、次回で第1章は終わりなの?
ううん。関数は色々説明することがあるから、もうちょっと続くよ。
あ、そうなんだ…
というわけで、また次回ね!


前へ | TOP | 次へ