複数の値をまとめて代入する「多重代入」はローカル変数に対して可能です。
多重代入とは
変数の宣言をカンマ「,
」で区切って並べて一括して行い、値の代入も一括して行う書き方です。いろんな言語が多重代入には対応していて仕様もちょっと違いますが、対応してさえいれば変数の宣言と値の代入はだいたい似た感覚で使えます。GML も一応対応していますが、まだ冗長な書き方になっています。
ローカル変数の宣言はカンマ区切りで一括した宣言が可能。以下書き方は構文的にも有効です。
var a,b,c;
しかし宣言と同時に値を代入する多重代入は以下の書き方だと構文エラー。
var a,b,c = 1,2,3;
上記はコンパイルの前にエラー訂正が弾くためコンパイルできません。GML でも有効な書き方は以下。
var a=10, b=20, c=30;
変数がローカルであることを示すキーワードの後、一個一個変数を宣言し値も入れてカンマで区切っていけば、これがローカル変数の多重代入となります。上記書き方だと変数 a
,b
,c
は全てスコープはローカルとなりました。ステートメントの終了を示す;
(セミコロン)を忘れないように。
ではこれ以外の多重代入はどうでしょうか?以下を試して見ました。
val a, b, c = 10;
やった!これはコンパイルが通ります。しかし本来期待した動作とは違い var c
にだけ値が代入されました。そして var a
,b
の部分はローカル変数としての宣言だけ完了したみたい。ブレークポイントを設定してからデバッガで見ると分かりやすいですが、
d
はインスタンス変数なので Self.d
として扱われている。それより前に宣言した a
,b
については宣言しただけで初期値が代入されていない。そして改めて a
に値を代入した時点でデバッガはローカル変数として a
を表示しましたが、初期値がまだ代入されていない b
についてはデバッガも表示しません。でもローカル変数としての宣言自体は終わっているので、b
というローカル変数はメモリ上のどっかでデータが入るのを待っているようです。
多重代入が可能なら var a
,b
,c
全てに10
が代入されることを期待していました。
GML は宣言された変数に対して型チェックが行われないから、型が未定義でも宣言された時点できちんと確保はできてるみたいです。だから構文エラーにはならないし、値は一番最後に宣言された c
に対してだけ代入されたようです。
GML の作法
GML では書き方が冗長にならざるを得ません。
var a,b,c;
a=1;b=2;c=3;
こうなるかもしくは
var a=1, b=2, c=3;
var a=1; var b=2; var c=3;
こうせざるを得ない。
配列はもっとブサイクになる。比較的新しい設計の言語では配列への値代入も洗練されていて
a={1,2,3};
配列の宣言と配列への代入をこの一行で済ます言語(lua)があるというのに GML だと
a[0]=1; a[1]=2; a[2]=3;
これは嫌だ。しかしこれが GML であり、書き方が少々冗長になります。