函数
函数 是 Move 程序的基本构建块。它们可以从用户交易和其他函数中调用,并将可执行代码分组为可重复使用的单元。函数可以接受参数并返回值。它们在模块级别使用 fun
关键字声明。就像其他模块成员一样,默认情况下它们是私有的,只能从模块内部访问。
函数声明
- 按照惯例,Move 中的函数使用蛇形命名法 (snake_case) 命名。这意味着函数名应全部小写,单词之间用下划线分隔。例如,
do_something
,add
,get_balance
,is_authorized
等等。 - 函数使用关键字
fun
声明,后跟函数名(一个有效的 Move 标识符)、括号中的参数列表和返回类型。函数体是一个包含一系列语句和表达式的代码块。函数体中的最后一个表达式是函数的返回值。
示例:
move
module book::math;
/// 函数接受两个类型为 `u64` 的参数,并返回它们的和。
/// `public` 可见性修饰符使函数可以从模块外部访问。
public fun add(a: u64, b: u64): u64 {
a + b
}
#[test]
fun test_add() {
let sum = add(1, 2);
assert!(sum == 3);
}
- 在此示例中,我们定义了一个函数
add
,它接受两个类型为u64
的参数并返回它们的和。该函数从test_add
函数调用,该函数位于同一模块中。在测试中,我们将add
函数的结果与预期值进行比较,如果结果不同,则中止执行。 - 如果函数不返回任何值,则返回类型可以省略,或者显式指定为
()
,代表单元类型。
move
fun return_nothing() {
// 空表达式,函数返回 `()`
}
访问函数
- 就像其他模块成员一样,可以通过路径导入和访问函数。路径由模块路径和函数名组成,以
::
分隔。例如,如果您在book
包的math
模块中有一个名为add
的函数,则其路径将是book::math::add
,或者如果导入了该模块,则为math::add
。
返回值
- 函数可以使用
return
语句返回一个值。如果没有显式return
语句,则函数体中的最后一个表达式将作为返回值。 - 函数可以返回元组。元组是多个值的集合,可以用于从函数返回多个值。
示例:
move
module book::user_info;
/// 返回用户的姓名和年龄
public fun get_name_and_age(): (vector<u8>, u8) {
(b"John", 25)
}
#[test]
fun test_return_tuple() {
// 元组必须解构才能访问其元素。
// name 和 age 声明为不可变变量。
let (name, age) = get_name_and_age();
assert!(name == b"John");
assert!(age == 25);
}
- 如果需要将声明的值声明为可变的,则将
mut
关键字放在变量名之前:
move
// 将 name 声明为可变的,age 声明为不可变的
let (mut name, age) = get_name_and_age();
- 如果某些参数未使用,则可以使用
_
符号忽略它们:
move
// 忽略 name,只使用 age
let (_, age) = get_name_and_age();
总结
- 函数是 Move 程序的基本构建块,用于组织和重用代码。
- 函数可以使用
fun
关键字声明,并可以接受参数和返回值。 - 函数可以使用
return
语句返回值,并可以使用元组返回多个值。 - 函数可以通过路径导入和访问。