Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

函数

函数是 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 Fnimpl FnMutimpl FnOnce 额外携带调用签名;需要运行时分派时可使用拥有或借用的 dyn Trait / dyn Fn*。完整的捕获规则、调用能力与限制见闭包与迭代器

函数声明

有些函数可能只声明签名,具体实现由外部提供:

fun external_log(value: i32);

这种形式以分号结束,没有函数体。