if / else if / else
Rust的条件判断不需要括号,所有常见的逻辑运算符依然适用。
fn main() {
let x = 42;
if x < 42 {
println!("less than 42");
} else if x == 42 {
println!("is 42");
} else {
println!("greater than 42");
}
}
循环
单纯的循环可以用loop实现,使用break退出循环
fn main() {
let mut x = 0;
loop {
x += 1;
if x == 42 {
break;
}
}
println!("{}", x);
}
while
while 允许给循环加上条件,一旦条件变为 false ,循环就会退出
fn main() {
let mut x = 0;
while x != 42 {
x += 1;
}
}
for
rust的for是一个强大的升级。他遍历来自计算结果为迭代器的任意表达式的值。
迭代器是什么?迭代器是一个你可以一直询问“下一项是什么?”直到没有其他项的对象。
. . 运算符创建一个可以生成包含起始数字,但不包含末尾数字的数字序列的迭代器。
. .= 运算符创建一个可以生成包含起始数字,且包含末尾数字的数字序列的迭代器。
fn main() {
for x in 0..5 {
println!("{}", x);
}
for x in 0..=5 {
println!("{}", x);
}
}
match
类似于C语言中的switch语句,rust中的match语句用于匹配值的所有可能条件,并在匹配为真时执行相应代码。它不仅支持匹配数字,还支持更多更复杂的数据模式匹配。
match的意思的穷尽的,意在表明所有可能的值都要被考虑到。
匹配和解构相结合是章节目前为止接触到的最常见的模式之一。
fn main() {
let x = 42;
match x {
0 => {
println!("found zero");
}
// 我们可以匹配多个值
1 | 2 => {
println!("found 1 or 2");
}
// 可以匹配迭代器
3..=9 => {
println!("found a number 3 to 9 inclusively");
}
// 可以将匹配值绑定到变量
matched_num @ 10..=100 => {
println!("found {} number between 10 and 100!", matched_num);
}
// 默认匹配,如果没有可以处理所有情况,在必须存在该匹配
_ => {
println!("found somthing else!");
}
}
}
从循环中返回值
loop可以被中断以返回一个值。
fn main() {
let mut x = 0;
let v = loop {
x += 1;
if x == 13 {
break "found the 13";
}
};
println!("from loop: {} ", v);
}
从块表达式返回值
if,match,函数,以及作用域都有一种返回值的独特方式。
如果if、match、函数或作用域的最后一条语句是不带 ; 的表达式,rust 将把它作为一个值从块中返回。这是一种创建简洁逻辑的好方法,它返回一个 可以放入新变量的值。
注意,它还允许 if 语句像简洁的三元表达式一样操作。
fn example() -> i32 {
let x = 42;
// rust的三元表达式
let x = if x < 42 { -1 } else { 1 };
println!("from if: {}", v);
let food = "hamburger";
let result = match food {
"hotdog" => "is hotdog",
// 注意,当它只是一个返回表达式时,大括号是可选的
_ => "is not hotdog",
};
println!("identifying food: {}", result);
let v = {
// 这个作用域块让我们得到一个不影响函数作用域的结果
let a = 1;
let b = 2;
a + b
};
println!("from block: {}", v);
// 最后从函数中返回值的惯用方法
v + 4
}
fn main() {
println!("from function: {}", example());
}