跟着谷歌团队学Rust -控制流详细入门

59 阅读5分钟

大家好,我是梦兽编程。欢迎回来与梦兽编程一起刷Rust的系列。

这是由 Google 的 Android开发团队的分享Rust课程。本课程涵盖了 Rust 的方方面面,从基本语法到泛型和错误处理等高级主题。

该课程的最新版本可以在 google.github.io/comprehensi…找到。如果您正在其他地方阅读,请检查那里的更新。

如果你喜欢看梦兽编程的版本可以订阅跟着谷歌安卓团队学Rust订阅最新内容,梦兽编程也期待大家关注我的个人网站。

加入梦兽编程微信群个人掘金主页点击沸点扫描进入,活体咨询师

控制流

我们在编码的过程中大部分的时间都花费在对程序的控制上,也就是我们的常说的逻辑判断。让软件可以按我们预期的结果进行输出内容。

与其他语言一样rust也提供了很多控制流相关的关键字,但rust在c/c++的编码基础上去除了部分特性,rust把部分容易出错的特性去掉。让大家阅读的代码的时候更好的发现问题。

感兴趣可以回到之前的内容中看看那个最简单的c语言程序代码。 https://rexweb.link/technical-column/learn-rust-from-the-android-team/跟着谷歌安卓团队学rust.html

代码块

fn main() {
    let x = {
        let y = 10;
        println!("y: {y}");
        let z = {
            let w = {
                // 没有分号
                3 + 4
            };
            println!("w: {w}");
            // 没有分号
            y * w
        };
        println!("z: {z}");
        // 没有分号
        z - y
    };
    println!("x: {x}");
}

我们在定义代码的时候可以用let x = {};这种方式定义代码块,这样你可以方便的查阅你的代码块在那个区域,在面对一些生命周期的存活问题可以起到辅助分析的作用。

在上面的例子中,注意一下注释的地方是没有;。这里等于把结果赋值给变量。在这里我们可以得到这样的结果。

y: 10
w: 7
z: 70
x: 60

同样这种写法一样可以运作在函数中,可以简写return的关键词。

fn double(x: i32-> i32 {
    x + x
}

fn main() {
    println!("double: {}"double(7));
}

IF 表达式

与其他语言类似rust的IF关键字作用是一样的。但是有一点特殊的用法,如果你已经明白上面的代码块的变量赋值的写法。应该很容易理解。

正常我们是这么写。

fn main() {
    let mut x = 10;
    if x % 2 == 0 {
        x = x / 2;
    } else {
        x = 3 * x + 1;
    }
}

但在rust中他的特性可以让我们这么写

fn main() {
    let mut x = 10;
    x = if x % 2 == 0 {
        x / 2
    } else {
        3 * x + 1
    };
}

这个就因人而异。可个人喜好,第二种可以理解成一种三元表达式的升级版吧,感觉比三元表达式理解起来方便很多。

For 表达式

在Rust中如果我们需要做loop的操作有两种方式一种是For表达式。另一个while表达式。它们都会自己调用rust中的into_iter()表达式进行迭代器相关的工作。

fn main() {
    let v = vec![102030];

    for x in v {
        println!("x: {x}");
    }
    for i in (0..10).step_by(2) {
        println!("i: {i}");
    }
}

如果你有需要间隔遍历可是使用step_by进行操作。可以理解为没2项进行执行输出结果为:

i : 2
i : 4
i : 6
i : 8
i : 10

在for表达式中我们也可以和其他语言一样使用break表达式结束本次for表达式的遍历。continue表达式跳过某一次的遍历。

while 表达式

fn main() {
    let mut x = 10;
    while x != 1 {
        x = if x % 2 == 0 {
            x / 2
        } else {
            3 * x + 1
        };
    }
    println!("x: {x}");
}

用法与其他语言类似,与IF表达式类似。它依然不需要你添加(),比如JavaScript语法中:

if (条件表达式) {

}

新增loop表达式

在一下业务中,我往往需要写一个死循环来监听。避免我们的程序执行完毕,如果你做网络通信。你应该很容易看到下面这种代码:

while(true) {

}

在rust中提供一种比较简洁的表达式,使我们的代码可读性提高。

fn main() {
    let mut x = 10;
    loop {
        x = if x % 2 == 0 {
            x / 2
        } else {
            3 * x + 1
        };
        if x == 1 {
            break;
        }
    }
    println!("x: {x}");
}

没有Switch表达式

在 Rust 中没有像其他编程语言(如 C、C++、Java)中的 switch 表达式的原因是出于设计上的考虑。Rust 的设计哲学之一是避免引入不必要的语言特性,以保持语言的简洁性和安全性。

在 Rust 中,可以使用 match 表达式来实现类似 switch 的功能。

这个后面会详细讲解,match表达式可以根据不同的模式匹配来执行不同的代码块。它可以处理多个分支情况,并且可以使用 .. 运算符来匹配范围。

fn main() {
    let number = 3;

    match number {
        1 => println!("One"),
        2 => println!("Two"),
        3 => println!("Three"),
        _ => println!("Other"),
    }
}

在上面的示例中,根据 number 的值,match 表达式会执行相应的代码块。如果没有匹配的模式,可以使用下划线 _ 来处理默认情况。

虽然在 Rust 中没有像 switch 表达式那样的特定语法,但使用 match 表达式可以实现类似的功能,并且更加灵活和安全。

微信搜索梦兽编程公众号