On this page |
概要 ¶
VEXのデータ型にはdict
というものがあります。
VEXは型に厳しいので、パラメータ毎に値とその型が可変するパラメータセットを扱うのが難しいです。
dict
という型は、そのような場合に対処することができます。
dict
という型は、辞書を1エントリーにつき1変数として展開する方法と比べて非常に効率性が悪くなります。
そのため、変数と型のセットが可変するような場合にのみ使用してください。
辞書リテラル ¶
唯一対応している辞書リテラルは空っぽの辞書です: {}
。
dict s = {};
辞書型の宣言 ¶
辞書変数を宣言する一般的な形式はdict var_name
です:
// 通常の辞書 dict mydict;
辞書を返す関数の宣言:
// 辞書を返す関数 dict rgb_table() { ... };
辞書の値 ¶
辞書のインデックス、キーは常に文字列です。
この文字列にはどのような値も入れることができますが、その処理を簡単にするために、空っぽの文字列や.
を含んだ文字列を避けることを推奨します。
辞書の値には、VEXのほとんどの基本型を入れることができます:
int
, float
, vector2
, vector
, vector4
, matrix2
,
matrix3
, matrix
, string
, int[]
, float[]
, string[]
,
dict
, dict[]
。
辞書の値にアクセス、設定する方法 ¶
辞書のキーを使用して値を照会するには、dict[index]
を使用します。
index
は、値の照会に使用するキー文字列です。
このキーが辞書になかった場合、その結果はデフォルトの初期値になります。
VEXはコンパイル時に型が分かっている必要がありますが、実際に格納される型はランタイム時に変えることができます。 そのため、抽出したい型を選択する明示的な関数キャスト(型変換)が必要になる事が多々あります。 型変換が可能な場合、ネイティブの型がその目的の型に変換されます。
dict dictionary; // 空っぽの辞書を作成します。 dictionary['key'] = 3; // keyインデックスに3を格納します。 float three = dictionary['key']; // keyを抽出します。 dictionary['newkey'] = dictionary['key']; // エラー: 曖昧な型! dictionary['newkey'] = int(dictionary['key']); // keyをintとして抽出してコピーします。
getcomp
関数の3番目の引数にデフォルト値を設定して使用することで、2番目の引数で指定したキーが見つからなかった時にそのデフォルト値を返すようにすることができます。
そのキーが存在しても型が違っていれば、そのデフォルト値が使用されます。
dict dictionary; dictionary['key'] = 3; int three = getcomp(dictionary, 'key', 52); int fiftytwo = getcomp(dictionary, 'nonkey', 52);
typeid
関数を使用することで、辞書値のタイプを識別することができます。
このIDと特定のVEXデータタイプのtypeid()
を比較することで、その値の実際のタイプに応じて別のコードパスを渡すことが可能になります。
dict dictionary; dictionary['key'] = set(1, 2, 3); int value_type = typeid(dictionary, 'key'); if (value_type == typeid(vector())) { // keyが'vector'タイプなので、このコードパスを渡します。 vector val = dictionary['key']; // ... vector値を使った何かの処理をします。 } else if (value_type == typeid(vector4())) { vector4 val = dictionary['key']; // ... vector4値を使った何かの処理をします。 }
辞書内のキーの内容は、insert
関数を使うことで、VEXに型を露出させることなく他の辞書にコピーすることができます。
他にも、このinsert
関数は2個の辞書を結合することができます。
dict a, b; a['key'] = 3; b['oldkey'] = 5; insert(b, 'newkey', a, 'key'); // b['newkey']が3になります。 insert(b, 'oldkey', a, 'nonkey'); // nonkeyがaには見つからないのでb['oldkey']が削除されます。 insert(b, a); // aのすべてのエントリーをbに追加し、競合が起きれば上書きされます。
set
関数を使用して辞書を構築することができます。
dict a; a = set("key", 3.0, "nextkey", 5.0, "lastkey", "stringvalue");
辞書の扱い方 ¶
以下の関数は、辞書を照会したり操作することができます。
辞書内のキーの数を返します。
辞書内のすべてのキーがアルファベット順で並んだ文字列配列を返します。
指定したキーが辞書に含まれているかどうかを返します。
辞書の値を別の辞書にコピーします。 これは、辞書のすべての値を別の辞書に結合することもできます。
辞書からキーを削除します。
キーと値のリストから辞書を構築します。