参数传递

函数总是带有参数,函数的参数可以是值、不可变引用 & 或可变引用 &mut。您可以在 Move书中找到引用的介绍。

1. 值参数

函数接受的值参数,值必须在函数结束时被消耗。消耗的方式有三种:

  • 传递给另一个函数。
  • 返回。
  • 销毁(丢弃,删除)。 (原始类型的值没有这些问题,因为它们是可复制和可丢弃的。)
fun transfer(castle: Castle, receiver: address) {
    // 传递值参数
    transfer::public_transfer(castle, owner);
}

fun get(castle: Castle): Castle {
    // 返回输入值
    // 这只是为了演示没有实际意义,如果我们想修改一个对象,
    // 通常使用可变引用 &mut。
    castle
}

fun destroy(castle: Castle) {
    // 销毁输入对象。我们将在后面的课程中深入探讨。
    let Castle {id, field1: _, field2: _, field3: _} = castle;
    object::delete(id);
}

fun wrong_use(castle: Castle) {
    // 错误!error[E06001]: 未使用的值没有 'drop'
    castle.level = castle.level + 1;
}

2. 不可变引用 &

不可变引用通常用于读取对象。

public(package) fun get_castle_race(castle: &Castle): u64 {
    castle.race
}

3. 可变引用 &mut

可变引用用于修改对象。

public(package) fun upgrade_castle(castle: &mut Castle) {
    castle.level = castle.level + 1;
}

要将可变引用转换为不可变引用,请使用 freeze(r)

public(package) fun upgrade_castle(castle: &mut Castle) {
    castle.level = castle.level + 1;
    
    let race = get_castle_race(freeze(castle));
    ...
}