関数
Moveの関数構文は、モジュール関数とスクリプト関数間で共有されます。モジュール内の関数は再利用可能ですが、スクリプト関数はトランザクションを呼び出すための1回だけ使用されます。
宣言
関数は、fun
キーワード、関数名、型パラメータ、パラメータ、戻り値の型、注釈の取得、最後に関数本体、の順序で宣言されます。
fun <identifier><[type_parameters: constraint],*>([identifier: type],*): <return_type> <acquires [identifier],*> <function_body>
例えば
fun foo<T1, T2>(x: u64, y: T1, z: T2): (T2, T1, u64) { (z, y, x) }
可視性
デフォルトでは、モジュール関数は同じモジュール内でのみ呼び出す事が出来ます。これらの内部関数 (プライベート関数 と呼ばれることもあります) は、他のモジュールやスクリプトから呼び出す事は出来ません。
address 0x42 {
module m {
fun foo(): u64 { 0 }
fun calls_foo(): u64 { foo() } // 有効
}
module other {
fun calls_m_foo(): u64 {
0x42::m::foo() // エラー!
// ^^^^^^^^^^^^ 'foo'は'0x42::m'の内部です
}
}
}
script {
fun calls_m_foo(): u64 {
0x42::m::foo() // ERROR!
// ^^^^^^^^^^^^ 'foo'は'0x42::m'の内部です
}
}
他のモジュールまたはスクリプトからのアクセスを許可するには、関数をpublic
かpublic(friend)で
宣言する必要があります。
public
の可視性
public
関数は 任意の モジュールまたはスクリプトで定義された 任意の 関数から呼び出す事が出来ます。以下の例で示すように、public
関数は以下により呼び出す事が出来ます。
- 同じモジュールで定義された他の関数
- 別のモジュールで定義された関数、または
- スクリプトで定義された関数
また、パブリック関数が受け取る事が出来る引数の型や戻り値の型も制限はありません。
address 0x42 {
module m {
public fun foo(): u64 { 0 }
fun calls_foo(): u64 { foo() } // 有効
}
module other {
fun calls_m_foo(): u64 {
0x42::m::foo() // 有効
}
}
}
script {
fun calls_m_foo(): u64 {
0x42::m::foo() // 有効
}
}