ジェネリクス
ジェネリクスを使用すると、異なる入力データ型に対して関数や構造体を定義できます。この言語機能は、パラメトリック多態性 として参照される事も有ります。Moveでは、ジェネリックという用語を型パラメーターや型引数と同じ意味でよく使用します。
ジェネリクスは、ベクターなどのライブラリコードでよく使用され、(指定された制約を満たす)あらゆるインスタンス化で機能するコードを宣言します。他のフレームワークでは、ジェネリクスコードを使用して、同じ実装を共有しながら、多数の異なる方法でグローバルストレージと対話す事が有ります。
型パラメーターを宣言する
関数と構造体は両方とも、シグネチャ内に山括弧<...>
で囲まれた型パラメータのリストを取ることができます。
凡用(ジェネリクス)関数
関数の型パラメータは、関数名の後、(値)パラメータリストの前へ配置されます。次のコードは、汎用ID関数を定義し、任意の型の値を受け取り、その値を変更せず返します。
module 0x42::example {
fun id<T>(x: T): T {
// この型の注釈は不要ですが有効です
(x: T)
}
}
T
型パラメータは定義されると、パラメータ型、戻り値の型、関数本体内で使用で出来ます。
ジェネリクス構造体
構造体の型パラメータは構造体名の後へ配置され、フィールドの型へ名前を付けるため使用出来ます。
module 0x42::example {
struct Foo<T> has copy, drop { x: T }
struct Bar<T1, T2> has copy, drop {
x: T1,
y: vector<T2>,
}
}
型引数
ジェネリクス関数を呼び出す
ジェネリクス関数を呼び出す場合、関数の型パラメータの型引数を山括弧で囲まれたリスト内で指定出来ます。
module 0x42::example {
fun foo() {
let x = id<bool>(true);
}
}
型引数を指定しない場合は、Moveの型推論が型引数を提供します。
ジェネリクス構造体を使う
ジェネリクス型の値を構築または破棄する時、構造体の型パラメータへ型引数のリストを添付する事も出来ます。
module 0x42::example {
fun foo() {
let foo = Foo<bool> { x: true };
let Foo<bool> { x } = foo;
}
}
型引数を指定しない場合は、Moveの型推論が型引数を提供します。