map は、1 つの値から別の値にマッピングしているキー/値のペアを保持するコンテナ型コンテナ型です。 マップの要素は、マップを作成するときにキー/値のペアの順に基づいて順序付けされ、それらの要素には定義した一意のキーでアクセスします。
たとえば、ある言葉を目にする回数を維持する場合は、その言葉をキーとして使用し、その回数を値として使用して、マップを作成します。
WordCount : [string]int = map{"apple" => 11, "pear" => 7}画像をクリックすると拡大表示されます。
マップを初期化するときに同じキーを複数回使用すると、マップはそのキーに対して指定された最後の値のみを維持します。 次の例では、WordCount は "apple" => 2 というキー/値のペアのみを持ち、 "apple" => 0 と "apple" => 1 のペアは破棄されます。
WordCount : [string]int = map{"apple" => 0, "apple" => 1, "apple" => 2}サポートされているキーの型
キーがすでにマップに存在するかどうかをチェックする方法が必要であるため、キーの型が比較可能であれば、キー/値のペアは任意の型の組み合わせにすることができます。
以下の型をキーとして使用できます。
クラス (比較可能である場合)
オプション (要素の型が比較可能である場合)
配列 (要素の型が比較可能である場合)
マップ (キーと値の両方の型が比較可能である場合)
タプル (タプルのすべての要素が比較可能である場合)
マップの長さ
マップのキー/値のペアの数は、マップのフィールド Length にアクセスすることで取得できます。 たとえば、map{"a" => "apple", "b" => "bear", "c" => "candy"}.Length は 3 を返します。
マップの要素にアクセスする
マップの要素には、WordCount["apple"] などのキーを使用してアクセスできます。
マップの要素へのアクセスは失敗する可能性がある式であり、if 式などの失敗コンテキストでのみ使用できます。 次に例を示します。
ExampleMap : [string]string = map{"a" => "apple", "b" => "bear", "c" => "candy"}
for (Key->Value : ExampleMap):
Print("{Value} in ExampleMap at key {Key}")キー | "a" | "b" | "c" |
値 | "apple" | "bear" | "candy" |
マップの要素を追加、変更する
マップのキーに特定の値を設定することでマップに要素を追加できます。 たとえば、set ExampleMap["d"] = 4 で要素を追加できます。 同様に、マップにすでに存在するキーに値を代入すると、既存のキー/値のペアを更新することができます。
マップへの要素の追加は失敗する可能性がある式であり、if 式などの失敗コンテキストでのみ使用できます。 次に例を示します。
var ExampleMap : [string]int = map{"a" => 1, "b" => 2, "c" => 3}
# Modifying an existing element
if (set ExampleMap["b"] = 3, ValueOfB := ExampleMap["b"]):
Print("Updated key b in ExampleMap to {ValueOfB}")
# Adding a new element
if (set ExampleMap["d"] = 4, ValueOfD := ExampleMap["d"]):
Print("Added a new key-value pair to ExampleMap with value {ValueOfD}")マップから要素を除去する
除去したいキーを含まない新しいマップを作成することにより、マップ変数から要素を除去することができます。 [string]int マップからの除去を行う関数の例を以下に示します。
# Removes an element from the given map and returns a new map without that element
RemoveKeyFromMap(ExampleMap:[string]int, ElementToRemove:string):[string]int=
var NewMap:[string]int = map{}
# Concatenate Keys from ExampleMap into NewMap, excluding ElementToRemove
for (Key -> Value : ExampleMap, Key <> ElementToRemove):
set NewMap = ConcatenateMaps(NewMap, map{Key => Value})
return NewMapウイーク マップ
weak_map 型は map 型のスーパータイプです。 ほとんどの場合、map 型を使用するのと同様に weak_map を使用できますが、以下の例外があります。
weak_mapにはLengthメンバーがないため、weak_mapに入っている要素の数をクエリすることはできません。weak_mapの要素に対してイテレートすることはできません。weak_mapに対してConcatenateMaps()を使用することはできません。
もう 1 つの違いは、weak_map の型定義では、weak_map 関数を使用してキー/値のペアの型を定義する必要があることです。たとえば、MyWeakMap:weak_map(string, int) = map{} では、文字列のキーと整数の値のペアを持つ MyWeakMap というウイーク マップが定義されます。 weak_map 型は map 型のスーパータイプであるため、標準の map{} で初期化できます。
weak_map 型の変数を作成してそのウイーク マップの要素にアクセスする例を以下に示します。
ExampleFunction():void=
var MyWeakMap:weak_map(int, int) = map{} # Supertype of the standard map, so it can be assigned from the standard map
if:
set MyWeakMap[0] = 1 # Same means of mutation of a particular element as the standard map
then:
if (Value := MyWeakMap[0]):
Print("Value of map at key 0 is {Value}")
set MyWeakMap = map{0 => 2} # Same means of mutation of the entire map as the standard map持続可能型
キー型と値型の両方が持続可能であれば、マップも持続可能な値になります。 map が持続可能な場合、モジュールスコープの weak_map 変数でそれらを使用し、ゲーム セッションにわたってその値を持続できます。 Verse での持続性の詳細については、「Verse で持続可能データを使用する」を参照してください。