宏函数的定义
基本语法
宏用 macro fun 定义。宏的类型参数名与值参数名必须以 $ 开头,以便与普通函数区分:
module example::def;
macro fun add_three($x: u64, $y: u64, $z: u64): u64 {
$x + $y + $z
}
public fun demo(): u64 {
add_three!(1, 2, 3)
}
- 调用必须使用
name!(...)(带!),与普通调用的name(...)区分。 - 宏可以有
public、public(package)、friend等可见性,规则与普通函数类似(依项目布局而定)。
$ 参数的含义
以 $ 开头的参数在宏体中按表达式/类型片段参与展开,而不是「先求值成一个值再传入」。具体语义见 §11.4 展开与求值。
与 fun 的对比(定义侧)
fun | macro fun | |
|---|---|---|
| 参数前缀 | 普通标识符 | 类型/值参数需 $(Move 2024 约定) |
| 调用语法 | f(a, b) | f!(a, b) |
| Lambda 形参 | 无(Move 无独立函数类型作为值) | 可有 lambda 形参(仅宏) |
小结
记住三样:macro fun、$ 参数、! 调用。下一节专门讲「展开」时到底发生了什么。