rust 快速入门——8 函数与表达式

117 阅读3分钟

普若哥们儿

github.com/wu-hongbing…

gitee.com/wuhongbing/…

函数与表达式

Rust 函数与其它语言基本类似,因此这里只介绍需要注意的内容。

函数定义与使用

Rust 函数使用 fn 关键字来声明。函数的参数需要标注类型,就和变量一样,如果函数返回一个值,返回类型必须在箭头 -> 之后指定。

mian 函数是一个特殊的函数,是可执行文件的入口。

Rust 代码中的函数和变量名使用 snake_case 规范风格。在 snake_case 中,所有字母都是小写并使用下划线分隔单词。

// 和 C/C++ 不一样,Rust 的函数定义位置是没有限制的
fn main () {
    // 我们可以在这里使用函数,后面再定义它
    fizzbuzz_to (100);
}

// 一个返回布尔值的函数
fn is_divisible_by (lhs: u32, rhs: u32) -> bool {
    // 边界情况,提前返回
    if rhs == 0 {
        return false;
    }

    // 这是一个表达式,可以不用 `return` 关键字
    lhs % rhs == 0
}

// 一个 “不” 返回值的函数。实际上会返回一个单元类型 `()`。
fn fizzbuzz (n: u32) -> () {
    if is_divisible_by (n, 15) {
        println! ("fizzbuzz");
    } else if is_divisible_by (n, 3) {
        println! ("fizz");
    } else if is_divisible_by (n, 5) {
        println! ("buzz");
    } else {
        println! ("{}", n);
    }
}

// 当函数返回 `()` 时,函数签名可以省略返回类型
fn fizzbuzz_to (n: u32) {
    for n in 1..=n {
        fizzbuzz (n);
    }
}

函数体由一系列的语句和一个可选的结尾表达式构成。Rust 是一门基于表达式(expression-based)的语言,让我们看看语句与表达式有什么区别以及这些区别是如何影响函数体的。

语句Statements)是执行一些操作但不返回值的指令。 表达式Expressions)计算并产生一个值。

fn main () {
    let y = {
        let x = 3;
        x + 1
    };

    println! ("The value of y is: {y}");
}

2-5 行是一个代码块,它的值是 4。这个值作为 let 语句的一部分被绑定到 y 上。注意 x+1 这一行在结尾没有分号,与你见过的大部分代码行不同。

表达式的结尾没有分号,如果在表达式的结尾加上分号,它就变成了语句,而语句不会返回值。在接下来探索具有返回值的函数和表达式时要谨记这一点。

函数可以向调用它的代码返回值,在箭头(->)后声明返回值的类型。在 Rust 中,函数的返回值等同于函数体最后一个表达式的值。使用 return 关键字和指定值,可从函数中提前返回;但大部分函数隐式的返回最后的表达式。

Rust 的函数不支持多返回值,但是我们可以利用元组来返回多个值

fn test() -> (i32, i32) {
    return (1, 2);
}
fn main() {
    let (x, y) = test();
    println!("x = {}, y = {}", x, y);
}

函数不能使用外部动态变量

函数不能使用外部动态变量,但是可以使用外部常量和外部静态变量

fn main() {
    static A: i32 = 5;
    const B: i32 = 6;
    let C: i32 = 7;
    fn test_inner() {
        println!("inner:{}", A);
        println!("inner:{}", B);
        // println!("{}", C); //非法
        println!("inner:{}", D);
    }
    test_inner();
}

const D: i32 = 9; //全局常量

fn test_outer() {
    println!("outer:{}", D);
}