タプルは、2 つ以上の 式 をグループ化して 1 つの式として扱います。
タプル リテラル は、次のように ()
の間に複数の式があり、各 要素 がカンマで区切られています。
(1, 2, 3)
タプルの要素の順番は重要です。 次のタプルは、前のタプルの例とは異なります。
(3, 2, 1)
次のように、タプルには複数の位置に同じ式を入れることもできます。
("Help me Rhonda", "Help", "Help me Rhonda")
タプルの式はどの 型 にすることもでき、(1 つの型の要素しか含めることができない 配列 とは異なり) 型を混在させることができます。
(1, 2.0, "three")
タプルには、次のように他のタプルを含めることもできます。
(1, (10, 20.0, "thirty"), "three")
この分野の用語に精通している場合は、タプルを次のようなものであると考えてください。
- 名前のない要素が順番に並べられた名前のないデータ構造
- 各要素の型が異なる場合がある固定サイズの配列
タプルは、次のような場合に特に有用です。
タプル型で変数を指定する
タプルとして変数の型を指定するには、次のように ()
で囲まれたカンマ区切りの型の前に tuple
プレフィックスを入れます。
MyTupleInts : tuple(int, int, int) = (1, 2, 3)
MyTupleMixed : tuple(int, float, string) = (1, 2.0, "three")
MyTupleNested : tuple(int, tuple(int, float, string), string) = (1, (10, 20.0, "thirty"), "three")
タプル型は、次のように 推測する ことも可能です。
MyTupleInts := (1, 2, 3)
MyTupleMixed := (1, 2.0, "three")
MyTupleNested := (1, (10, 20.0, "thirty"), "three")
タプル型の 指定子 は、次のようにパラメータか 戻り値 の型のデータ メンバー と 関数型シグネチャ で使用できます。
ExampleFunction(Param1 : tuple(string, int), Param2 : tuple(int, string)) : tuple(string, int) =
# 結果にパラメータを使用します
Param1
タプル要素へのアクセス
タプルの要素には、整数を取得する、失敗することがないゼロベースの インデックス 演算子 でアクセスできます。インデックス演算子は、コンパイラが常にタプルの要素の数を把握しており、範囲外のインデックスは コンパイル時間 エラーになるため、(失敗することがある配列インデックス演算子 [index]
とは異なり) 失敗することがありません。
MyTuple := (1, 2.0, "three")
MyNestedTuple := (1, (10, 20.0, "thirty"), "three")
var MyInt: int = MyTuple(0)
var MyFloat: float = MyTuple(1)
var MyString: string = MyTuple(2)
Print("My variables: {MyInt}, {MyFloat}, {MyString}")
Print("My nested tuple element: {MyNestedTuple(1)(2)}")
タプル配列強制
タプル要素の型が配列の型とまったく同じであれば、配列を求められたときにいつでもタプルを渡すことができます。 タプルを求められた場合に配列を渡すことはできません。
タプル展開
単一の要素として関数に渡されたタプルは、その関数がそのタプルの各要素で個別に呼び出されたかのようになります。これは タプル展開、または スプラッティング と呼ばれます。
F(Arg1 : int, Arg2 : string) : void =
DoStuff(Arg1, Arg2)
G() : void =
MyTuple := (1, "two")
F(MyTuple(0), MyTuple(1)) # 要素にアクセス
F(MyTuple) # タプル展開
sync
構造化並列処理 式には、経時的に 評価 を行ういくつかの 引数 を同時に評価できるタプルの 結果 が含まれています。詳細については、並列処理 を参照してください。
持続可能型
すべての要素型が持続可能であれば、タプルも持続可能な値になります。持続可能なタプルをモジュールスコープの weak_map
変数で使用すると、ゲーム セッションの間中、その値を持続できます。Verse における持続性の詳細については、「Verse で持続データを使用する」を参照してください。