循环/判断
ref: 流程控制 - Rust语言圣经(Rust Course)
判断
if condition == true {
// A...
} else {
// B...
}
if 语句块是表达式,所以可以为变量赋值,当然要注意的是保证返回的类型相同:
fn main() {
let condition = true;
let number = if condition {
5
} else {
6
};
println!("The value of number is: {}", number);
}
循环
rust有三种循环方式:for / while 和 loop。
for
for 元素 in 集合 {
// 使用元素干一些你懂我不懂的事情
}
// 例如,输出1-5:
fn main() {
for i in 1..=5 {
println!("{}", i);
}
for _ in 0..10 {
// 循环中不使用 i
}
}
在Rust中,使用for遍历集合要注意所有权:
使用方法 | 等价使用方式 | 所有权 |
---|---|---|
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() | 可变借用 |
如果是实现了copy特征的数组,例如[i32,10],for item in arr 不会所有权转移,而是直接进行了拷贝
两种循环方式优劣的比较:
// 第一种
let collection = [1, 2, 3, 4, 5];
for i in 0..collection.len() {
let item = collection[i];
// ...
}
// 第二种
for item in collection {
}
- 性能:第一种方式使用索引访问时,每次都会进行边界检查导致性能损耗,而第二种方式不会触发这种检查,因为在编译时便会确认这种访问方式是合法的。因此第二种方式性能更优。
- 安全:第一种方式通过索引访问,存在两次访问之间collection发生变化,导致脏数据产生的可能;而第二种方式通过迭代连续访问,由于所有权的限制,数据不会发生变化,所以第二种方式更加安全。
continue和break
for i in 1..4 {
if i == 2 {
continue;
}
println!("{}", i);
}
// 1 3
for i in 1..4 {
if i == 2 {
break;
}
println!("{}", i);
}
// 1
while
fn main() {
let mut n = 0;
loop {
if n > 5 {
break
}
println!("{}", n);
n+=1;
}
println!("我出来了!");
}
while vs for:
while 与 for 通过索引便利一样,在性能和安全上比不过 for 迭代器遍历。
loop
简单的无限循环
fn main() {
loop {
println!("again!");
}
}
loop通常与break一起使用,break可以为 loop 语句块的返回值:
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {}", result);
}
标签:--,流程,collection,break,item,let,loop,println,Rust
From: https://www.cnblogs.com/heymeteor/p/17670668.html