大家好,我是梦兽编程。欢迎回来与梦兽编程一起刷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![10, 20, 30];
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 表达式可以实现类似的功能,并且更加灵活和安全。
微信搜索梦兽编程公众号