Skip to content

函数

函数 是 Move 程序的基本构建块。它们可以从用户交易和其他函数中调用,并将可执行代码分组为可重复使用的单元。函数可以接受参数并返回值。它们在模块级别使用 fun 关键字声明。就像其他模块成员一样,默认情况下它们是私有的,只能从模块内部访问。

函数声明

  • 按照惯例,Move 中的函数使用蛇形命名法 (snake_case) 命名。这意味着函数名应全部小写,单词之间用下划线分隔。例如,do_somethingaddget_balanceis_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 语句返回值,并可以使用元组返回多个值。
  • 函数可以通过路径导入和访问。