配列変数とコンテナ変数
前の章で覚えた変数は1つの名前と1つの値を持つ、最も単純な変数の基本形「スカラー変数」と呼ばれるものです。
WMLの変数には「スカラー変数」の他に、「配列変数」と「コンテナ変数」があります。
配列変数とは、複数のコンテナ変数が番号を付けて並べられたものです。
コンテナ変数とは、複数のスカラー変数を格納した箱のようなものです。
さらにコンテナ変数には別のコンテナ変数を入れることができます。マトリョーシュカ人形みたいな感じです。
イメージにすると下図のような感じでしょうか。
配列変数の作成は、WML的には次のように表現できます。
[set_variables] name = "my_variable" mode = replace [value] variable_1 = "value_1" variable_2 = "value_2" variable_3 = "value_3" [/value] [value] variable_4 = "value_4" variable_5 = "value_5" variable_6 = "value_6" [my_container] variable_7 = "value_7" variable_8 = "value_8" [/my_container] [/value] [value] variable_9 = "value_9" variable_10 = "value_10" variable_11 = "value_11" [/value] [/set_variables]
スカラー変数を作る時には[set_variable]というタグを使いましたが、ここでは[set_variables]となっています。、複数の変数を扱うので複数形って事です。
配列変数を設定する時は、まず配列変数に名前を付けます、それがname="my_variable"です。次の行のmode=replaceは新規に配列を作成するという意味です。
そして次に[value]というタグが出てきます。ちょっと待って! valueはキーじゃないの? そう思ったなら、あなたは優秀です。
スカラー変数で使ったvalueと[value]は別物です。ここは間違いやすいので注意しましょう。
[value]タグは何をするかと言うと、配列するためのコンテナを作ります。[value]から[/value]までが1つのコンテナ変数になります。
先ほど配列はコンテナ変数に番号をつけると書きましたが、明示的なコンテナの通し番号のようなものは見当たりませんね。
番号はコンテナの記述順に自動的に付加されます。
この例では[value]・・・[/value]のセットが3つありますが、それぞれのコンテナの名前は上から順に"my_variable[0]"、"my_variable[1]"、"my_variable[2]"となります。
コンテナの番号はかならず[0]から始まることに留意してください。
さて、なんとなく判っていると思いますが、[value]が扱うキーはスカラー変数のnameになります。
これまで出て来たキーはWMLであらかじめ定義されたものだけでしたが、ここでは任意の変数の名前という文字列を設定します。
variable_1 = "value_1"
つまり、コンテナの中の変数名に直接「値」を割り当てています。これがコンテナ内のスカラー変数を記述する方法です。
次に2番目のコンテナを見てください。("my_variable[1]"のコンテナです)
[my_container]というタグがあります。これはコンテナの中にさらにコンテナが入っている状態を表しています。
このタグはコンテナ内コンテナの名前になります。ここでは[value]を使っていません、一番外側のコンテナは[value]でなければならないようですが、子のコンテナは任意の名前を付ける事ができます。いつも[value]を使っていては扱う変数が増えるにつれて区別がつけにくくなります。混乱を避けるためにも、コンテナの中にコンテナを含める場合は任意のコンテナ名をタグにして記述します。
配列変数では[value]で括られたコンテナに自動的に番号付きの名前を付加しますが、コンテナの中では多少異なります。
中のスカラー変数には通し番号は与えられません、"variable_1[0]"、"variable_2[1]"、"variable_3[2]"とはならないのです。
しかし、子コンテナが存在する場合は配列番号が与えられます。同じ名前の子コンテナが複数ある場合は記述順に[0][1]....[6]となります。子コンテナの中のスカラー変数にアクセスする場合、次のように書く事ができます。
my_variable[1]. my_container[0]. variable_7
コンテナが1つだけ、もしくは同名のコンテナが無い場合は配列番号は省略できます。
配列変数内の個別のスカラー変数にアクセスするには
さきほどは配列変数の記述方法を説明しましたが、配列変数を利用するためには中に入っている個別のスカラー変数にアクセスする必要があります。
スカラー変数の1つを任意の値と比較する。
[variable] name = "my_variable[0].variable_1" equals = 1 [/variable]
これは"my_variable[0]"の中の"variable_1"の値が 1 と同じかどうかを評価しています。
コンテナ内に、さらにコンテナがある場合は、
[variable] name = "my_variable[1].my_container.variable_7" equals = 1 [/variable]
コンテナ"my_variable[0]"内の"my_container"内の"variable_7"にアクセスしています。
スカラー変数の1つを任意の値に書き換える。
[set_variable] name = "my_variable[0].variable_1" value = "peach" [/set_variable]
[set_variable] name = "my_variable[1].my_container.variable_7" value = "banana" [/set_variable]