Rust--流程控制

循环/判断

ref: 流程控制 - Rust语言圣经(Rust Course)

判断

rust 复制代码
if condition == true {
    // A...
} else {
    // B...
}

if 语句块是表达式,所以可以为变量赋值,当然要注意的是保证返回的类型相同:

rust 复制代码
fn main() {
    let condition = true;
    let number = if condition {
        5
    } else {
        6
    };

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

循环

rust有三种循环方式:for / while 和 loop。

for

rust 复制代码
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 不会所有权转移,而是直接进行了拷贝

两种循环方式优劣的比较:

rust 复制代码
// 第一种
let collection = [1, 2, 3, 4, 5];
for i in 0..collection.len() {
  let item = collection[i];
  // ...
}

// 第二种
for item in collection {

}
  • 性能:第一种方式使用索引访问时,每次都会进行边界检查导致性能损耗,而第二种方式不会触发这种检查,因为在编译时便会确认这种访问方式是合法的。因此第二种方式性能更优。
  • 安全:第一种方式通过索引访问,存在两次访问之间collection发生变化,导致脏数据产生的可能;而第二种方式通过迭代连续访问,由于所有权的限制,数据不会发生变化,所以第二种方式更加安全。

continue和break

rust 复制代码
 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

rust 复制代码
fn main() {
    let mut n = 0;

    loop {
        if n > 5 {
            break
        }
        println!("{}", n);
        n+=1;
    }

    println!("我出来了!");
}

while vs for:

while 与 for 通过索引便利一样,在性能和安全上比不过 for 迭代器遍历。

loop

简单的无限循环

rust 复制代码
fn main() {
    loop {
        println!("again!");
    }
}

loop通常与break一起使用,break可以为 loop 语句块的返回值:

rust 复制代码
fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {}", result);
}
相关推荐
一个小坑货2 小时前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet272 小时前
【Rust练习】22.HashMap
开发语言·后端·rust
VertexGeek4 小时前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
前端与小赵1 天前
什么是Sass,有什么特点
前端·rust·sass
一个小坑货1 天前
Rust基础
开发语言·后端·rust
Object~1 天前
【第九课】Rust中泛型和特质
开发语言·后端·rust
码农飞飞1 天前
详解Rust结构体struct用法
开发语言·数据结构·后端·rust·成员函数·方法·结构体
Dontla2 天前
Rust derive macro(Rust #[derive])Rust派生宏
开发语言·后端·rust
fqbqrr2 天前
2411rust,编译时自动检查配置
rust
梦想画家2 天前
用Rust中byteorder包高效处理字节序列
rust·序列化·byteorder·文件编码