函数
函数 是 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语句返回值,并可以使用元组返回多个值。 - 函数可以通过路径导入和访问。
