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);
}
相关推荐
西风测评9 小时前
安全的自动更新怎么做:minisign 签名、先验签后解析与防回滚
rust·ssh
Delightrs11 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
奶油话梅糖12 小时前
快过 IDM 5 倍、开源免费:4,200 Star 的 Rust 下载器用 7 组对照实验“单挑“行业老大
rust·开源·idm
Zan1 天前
Tauri 2 实战:为什么一个可靠的桌面应用,应该由 Rust Host 管理生命周期?
前端·架构·rust
RobinDevNotes1 天前
从 Electron 到 GPUI,9 个跨平台桌面方案该怎么选
前端·javascript·rust·electron·openresty·前端开发工具
灿飞屋2 天前
Rust 编程其实很简单
开发语言·rust
蔡少将2 天前
用 Tauri 2 给 Mac 应用接 Touch ID,签名公证都做了,还是 -34018
rust
木子欢儿2 天前
国内 macOS/Linux 安装 rust
linux·运维·服务器·macos·rust
Kapaseker2 天前
Rust 一行 entry() 干掉五行 if/else
rust
红尘散仙3 天前
谁说终端只能敲键盘?我用 Rust 给小说阅读器加上了鼠标
前端·后端·rust