Skip to main content

Rust 基础入门 - 第四章

流程控制的地位不多说,Rust 中是从上而下执行的。

IF- 分支控制

if-else 语句的语法如下:


fn main() {
let condition = true;
let number = if condition {
5
} else {
6
};

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

有两个注意点:

  1. if-else 语句的返回值是一个表达式,所以可以直接赋值给一个变量。
  2. if-else 语句的返回值必须是相同的类型,否则会报错。

ELSE-IF 多重条件分支

不多上,直接上:

fn main() {
let n = 6;

if n % 4 == 0 {
println!("number is divisible by 4");
} else if n % 3 == 0 {
println!("number is divisible by 3");
} else if n % 2 == 0 {
println!("number is divisible by 2");
} else {
println!("number is not divisible by 4, 3, or 2");
}
}

很简单,自上而下判断分支,判断到满足条件的分支就执行,不再继续判断。

FOR 循环

简明的语法,和 JS 有点像:


// 1.
for item in collection {
// do something
}

// 2.

for item in IntoIterator::into_iter(collection) {
// do something
}

// 1 和 2 两种方式等价

对于集合对象,一般使用引用形式,如果不是的话,所有权就会被 move 到循环体内,导致循环体外的对象无法使用。

// 1.
for item in &collection {
// ...
}
// 2.
for item in collection.iter() {
// ...
}

// 1 和 2 两种方式等价
note

不过对于实现了 拷贝 特征的对象,比如数组,可以直接使用值形式,并不会被转移所有权

fn main() {
let a = [1, 2, 3, 4];
for item in a {
println!("{}", item);
}
println!("{:#?}", a);
}

如果要在循环中修改集合中的元素,可以使用 mut 关键字:

// 1.
for item in &mut collection {
// ...
}
// 2.
for item in collection.iter_mut() {
// ...
}

// 1 和 2 两种方式等价

在循环中获取索引,可以使用 enumerate 方法:

fn main() {
let a = [4, 3, 2, 1];
for (i, v) in a.iter().enumerate() {
println!(" 第 {} 个元素是{}", i + 1, v);
}
}

对于不想在循环体中使用的变量,可以用 _ 来代替,编译器会自动忽略:

for _ in 0..10 {
println!("Hello, world!");
}

WHILE 循环

当条件为 true 时,一直执行循环体,直到条件为 false 时,退出循环。


fn main() {
let mut n = 0;

while n <= 5 {
println!("{}!", n);

n = n + 1;
}

println!("LIFTOFF!!!");
}

LOOP 和 BREAK

loop 是一个简单的无限循环,在内部实现逻辑中,可以使用 break 来跳出循环。

fn main() {
let mut counter = 0;

let result = loop { // loop 返回值是一个表达式
counter += 1;

if counter == 10 {
break counter * 2; // break 返回值
}
};

println!("The result is {}", result);
}

逻辑很简单,注意点在于:

  1. break 既可以跳出循环,也可以返回值。
  2. loop 的返回值是一个表达式,所以可以直接赋值给一个变量。

参考资料