函数

一个 Rust 版本的著名面试问题 FizzBuzz

fn main() {
    fizzbuzz_to(20);   // 在下面定义了,不需要预先定义
}

fn is_divisible_by(lhs: u32, rhs: u32) -> bool {
    if rhs == 0 {
        return false;  // 特例,提前返回
    }
    lhs % rhs == 0     // 代码块的最后一个表达式即返回值value
}

fn fizzbuzz(n: u32) -> () {  // 没有返回值表示返回单元类型 `()`
    match (is_divisible_by(n, 3), is_divisible_by(n, 5)) {
        (true,  true)  => println!("fizzbuzz"),
        (true,  false) => println!("fizz"),
        (false, true)  => println!("buzz"),
        (false, false) => println!("{n}"),
    }
}

fn fizzbuzz_to(n: u32) {  // `-> ()` 通常被省略
    for i in 1..=n {
        fizzbuzz(i);
    }
}
  • 我们在 main 中提到一个下面写的函数。既不需要预先声明,也不需要头文件。

  • 声明的参数后跟一个类型(有些编程语言是相反的),然后是一个返回值类型。

  • 函数体(或任何代码块)的最后一个表达式会成为返回值。简单地省略表达式结尾的 ;

  • fizzbuzz_to() 里的 for 循环的范围表达式包含 =n,这让它包含了上边界。

  • fizzbuzz() 里的 match 表达式做了很多工作。下面会展开以展示发生了什么。

    (为了更清晰,添加了类型标注,但是可以省略。)

    let by_3: bool = is_divisible_by(n, 3);
    let by_5: bool = is_divisible_by(n, 5);
    let by_35: (bool, bool) = (by_3, by_5);
    match by_35 {
      // ...