首页 > 其他分享 >Rust--流程控制

Rust--流程控制

时间:2023-08-31 23:11:06浏览次数:40  
标签:-- 流程 collection break item let loop println Rust

循环/判断

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

相关文章

  • 贪心算法-Huffman树
    贪心算法-Huffman树1.哈并果子问题的概述及案例https://www.acwing.com/problem/content/150/上图为本问题的案例。实际上,本题就是霍夫曼树的应用。关于霍夫曼树的定义,这里就不再赘述。根据上图,实际上这道题就是在询问:将所有的果子堆进行合并,构造成一......
  • el-table不出现滚动条
    修改样式的时候,发现没出现自己想要的效果,用div重新布局以后,发现效果是出现了,但el-table滚动条不见了。解决:<divstyle="padding:2px;height:600px"><el-tablev-loading="loading":data="list"highlight-current-rowsty......
  • [6]-代码随想录算法训练营-dat7-哈希表-part2
    代码随想录算法训练营第七天|哈希表-part21.LeetCode454.四数相加II题目https://leetcode.cn/problems/4sum-ii/submissions/思路无刷随想录后想法将四数相加转化为两数之和借用unordered_map,利用两数之和思想解决本问题实现困难代码尚模糊,不过整个......
  • Opcserver 连接 Modbus 设备数据类型设置的探索
     一个电子秤通过modbus串口服务器连接到网络可以用iotclient工具读取到报文但是用kepsrver总是获取不到正确的数据 至此无解决问题头绪后来经网友提醒用modbus poll采集试试连接后数据可以采集到但是看起来怪怪的,都是科学计数法试着调整数据类型,最......
  • 【专题】抖音电商平台母婴行业营销白皮书报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33528原文出处:拓端数据部落公众号报告合集显示,由于新生儿出生率下降,母婴行业进入了存量时代。在这一背景下,抖音电商成为越来越多消费者的选择,尤其是24-40岁的三四线城市女性。这一消费群体更倾向于在线上购买,给母婴行业的线上销售带来了巨大的机遇......
  • 使用SheetJs实现在线预览Excel(保留单元格格式信息)
    一、寻找合适的在线预览Excel的js库经过百度各种搜索,加上ChatGpt推荐,决定用SheetJs实现在线预览Excel。下面是SheetJs的官网介绍:SheetJS电子表格简化读取、编辑和导出电子表格适用于网络浏览器和服务器Office365受到Microsoft信任 SheetJS软件为业务提供动力谷歌、......
  • 16、C++ primer 变量声明和定义的关系P41
    1、什么是分离式编译?分离式编译(SeparateCompilation)是一种软件开发技术,用于将一个大型的程序分割成多个独立的源代码文件,并分别进行编译。每个源代码文件通常包含一个模块、类、函数或者其他逻辑单元的实现。2、声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须......
  • 在 Amazon 搭建无代码可视化的数据分析和建模平台
    现代企业常常会有利用数据分析和机器学习帮助解决业务痛点的需求。如制造业中,利用设备采集上来的数据做预测性维护,质量控制;在零售业中,利用客户端端采集的数据做渠道转化率分析,个性化推荐等。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案......
  • 浏览器访问ip总是解析到域名的问题
     浏览器设置了默认的dns缓存时间,发现等待超过这个时间后,ip正常访问windows里清除dns缓存 ......
  • pg_rewind
    一、pg_rewind介绍pg_rewind功能:流复制主备数据库间数据目录同步工具。pg_rewind优点:仅复制产生变化的数据块和一些文件:新数据文件、配置文件、WALsegments。基本原理:pg_rewind检查源和目标集群的时间线历史以确定它们的分歧点,并在目标集群的pg_wal目录中找到WAL,一直到达分歧点。......