• Rust--流程控制


    循环/判断

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

    判断

    if condition == true {
        // A...
    } else {
        // B...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    fn main() {
        let condition = true;
        let number = if condition {
            5
        } else {
            6
        };
    
        println!("The value of number is: {}", number);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    循环

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

    for

    for 元素 in 集合 {
      // 使用元素干一些你懂我不懂的事情
    }
    
    // 例如,输出1-5:
    fn main() {
        for i in 1..=5 {
            println!("{}", i);
        }
        
        for _ in 0..10 {
          // 循环中不使用 i
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在Rust中,使用for遍历集合要注意所有权:

    使用方法等价使用方式所有权
    for item in collectionfor item in IntoIterator::into_iter(collection)转移所有权
    for item in &collectionfor item in collection.iter()不可变借用
    for item in &mut collectionfor 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 {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 性能:第一种方式使用索引访问时,每次都会进行边界检查导致性能损耗,而第二种方式不会触发这种检查,因为在编译时便会确认这种访问方式是合法的。因此第二种方式性能更优。
    • 安全:第一种方式通过索引访问,存在两次访问之间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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    while

    fn main() {
        let mut n = 0;
    
        loop {
            if n > 5 {
                break
            }
            println!("{}", n);
            n+=1;
        }
    
        println!("我出来了!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    while vs for:

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

    loop

    简单的无限循环

    fn main() {
        loop {
            println!("again!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    string类详解
    【EF Core】如何忽略影响导航属性(级联)
    通过Gunicorn、Supervisor和Nginx更好地运行Django
    警告:新版Outlook会向微软发送密码、邮件和其他数据
    有趣的statement stack
    [SpringMVC笔记] SpringMVC-06-JSON数据传递参数
    Azure Terraform(十一)Azure DevOps Pipeline 内的动态临时变量的使用
    商超仓库管理系统
    【机器学习】python机器学习使用scikit-learn对模型进行微调:按特征贡献大小保留最重要k个特征的transform
    Git使用
  • 原文地址:https://blog.csdn.net/w_xy999/article/details/132613061