👈 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 模式匹配