函数
函数是 Riddle 程序的基本组织单位。它把一段逻辑命名,让代码可以被复用、测试和组合。
当前 Riddle 使用 fun 定义函数。
定义函数
一个最小的函数可以没有参数,也没有显式返回类型:
fun greet() {
print!("{}", "hello")
}
函数名后面是一对括号,函数体放在 {} 中。
参数
参数写在括号里,每个参数都带类型:
fun greet(name: &str) {
print!("{}", name)
}
多个参数使用逗号分隔:
fun add(a: i32, b: i32) -> i32 {
a + b
}
参数也是绑定。传入非 Copy 值会移动所有权;整数、布尔值等实现了 Copy 的类型则按复制语义传入。完整规则见移动语义。
返回值
返回类型写在 -> 后面:
fun square(x: i32) -> i32 {
x * x
}
函数体最后一个没有分号的表达式就是返回值。
这和下面显式写 return 的形式表达同样的意图:
fun square(x: i32) -> i32 {
return x * x;
}
Riddle 鼓励在简单函数中使用尾表达式,因为它能减少样板代码。
提前返回
当你需要提前结束函数时,可以使用 return:
fun abs(x: i32) -> i32 {
if x < 0 {
return -x;
}
x
}
return 更适合错误分支、提前退出或复杂控制流。普通计算则可以交给尾表达式。
泛型函数
泛型函数的类型参数、推断、显式实参和 const 泛型见泛型一章。
可调用参数与返回值
参数位置可以使用一般的 impl Trait,它等价于由编译器引入一个满足该 bound 的隐藏泛型参数;返回位置的 impl Trait 隐藏一个具体返回类型,所有返回路径必须选择同一具体类型。impl Fn、impl FnMut 和 impl FnOnce 额外携带调用签名;需要运行时分派时可使用拥有或借用的 dyn Trait / dyn Fn*。完整的捕获规则、调用能力与限制见闭包与迭代器。
函数声明
有些函数可能只声明签名,具体实现由外部提供:
fun external_log(value: i32);
这种形式以分号结束,没有函数体。