👈 3 复合类型

分支

let n = 6;
if n % 4 == 0 {
	println!("divisible by 4");
} else if n % 3 == 0 {
	println!("divisible by 3");
} else {
	println!("not divisible by 4 or 3");
}

if 是表达式,具有返回值:

let condition = true;
let num = if condition { 5 } else { 6 };
println!("{num}");

循环

for

for i in 1..=5 {
	println!("{i}");
}

使用 for 时往往需对集合进行引用:

for item in &collection { }

否则,不具备 copy 特征的集合将被转移所有权。

在循环中修改元素需要 mut

for item in &mut collection { }
// 转移所有权
for item in collection { }
for item in IntoIterator::into_iter(collection) { }
 
// 不可变借用
for item in &collection { }
for item in collection.iter() { }
 
// 可变借用
for item in &mut collection { }
for item in collection.iter_mut() { }

for 中获取元素索引:

let a = [4, 3, 2, 1];
for (i, v) in a.iter().enumerate() {
	println!("a[{i}]={v}");
}

类似 Python,如果只是想循环 n 次,最好用下划线 _ 作为无实际意义的循环变量名,否则,编译器将发出 #[warn(unused_variables)] 警告:

for _ in 0..10 {}

对比 2 种循环方式:

let a = [1, 2, 3];
 
// for-i
for i in 0..a.len() {
	let x = a[i];
	// ...
}
 
// for-each
for x in a {
	// ...
}
  • 性能:for-i 会因边界检查导致性能损耗;for-each 不会触发检查,没有性能损耗。
  • 安全:for-i 对索引的访问不连续,collection 有可能在两次访问之间变化,导致脏数据产生;for-each 由于所有权限制,访问过程中 collection 不可能变化,更安全。

因此,从各种角度,for-each 都更好。

while

let mut n = 0;
while n <= 5 {
	println!("{}", n);
	n += 1;
}

while 对比 for-each

let arr = [1, 2, 3];
 
// while
let mut i = 0;
while i < arr.len() {
	println!("{}", arr[i]);
	i += 1;
}
 
// for-each
for v in arr {
	println!("{}", v);
}

for-each 的代码简洁,且无需边界检查,性能更好。

loop

loop 是一个简单的无限循环,必须使用 break 才能跳出。

loop 可以作为表达式返回结果,使用 break 返回。

let mut counter = 0;
let result = loop {
	counter += 1;
	if counter == 10 {
		break counter * 2; // 返回结果
	}
};
println!("The result is {}", result);

👉 5 模式匹配