参数传递
函数总是带有参数,函数的参数可以是值、不可变引用 &
或可变引用 &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));
...
}