分支
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 collection.into_iter() { }
// 不可变借用
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); // The result is 20