首页 > 其他分享 >Rust简易入门(七)

Rust简易入门(七)

时间:2024-04-24 16:22:53浏览次数:27  
标签:mut 入门 迭代 sum iter 简易 let fn Rust

迭代与循环

循环

定义:循环是一种控制流结构,它会反复执行一组语句,直到满足某个条件。
控制条件:循环通常包含一个条件表达式,只有在条件为真时,循环体中的语句才会执行。
退出条件:循环执行直到条件不再满足,或者通过break语句显式中断循环。
使用场景:适用于需要反复执行某个操作直到满足某个条件的情况。

迭代

定义:迭代是对序列中的元素进行逐个访问的过程。
控制条件:迭代通常使用迭代器(lterator)来实现,迭代器提供了对序列元素
的访问和操作。
退出条件:通常不需要显式的退出条件,迭代器会在处理完所有元素后自动停止。
使用场景:适用于需要遍历数据结构中的元素的情况,例如数组、切片、集合等。

循环和迭代的区别

  1. 循环是一种控制流结构,它反复执行一组语句。
    2.迭代是对序列中的元素进行逐个访问的过程,通常使用迭代器实现。
    3.循环可以是有限的(通过设置退出条件)或无限的(使用loop关键字)。
    4.迭代器提供了一种更抽象的方式来处理序列,使得代码更具可读性和灵活性。

在Rust中,循环和迭代性能的差距可能会取决于具体的使用情况和编译器的优化。绝大多数情况下,Rust的迭代器是经过优化的,可以达到或接近手动编写循环的性能水平。

fn sum_with_loop(arr: &[i32]) -> i32 {
    let mut sum = 0;
    for &item in arr {
        sum += item;
    }
    sum
}

fn sum_with_iter(arr: &[i32]) -> i32 {
    arr.iter().sum()
}

fn main() {
    const ARRAY_SIZE: usize = 1_000;
    let array:Vec<i32> = (1..=ARRAY_SIZE as i32).collect();
    let sum1 = sum_with_loop(&array);
    let sum2 = sum_with_iter(&array);
    println!("sum loop {}", sum1);
    println!("sum iter {}", sum2);
}

IntoIterator、Iterator和Iter之间的关系

IntoIterator Trait

Intol terator是一个Rust Trait,它定义了一种将类型转换为迭代器的能力。

该Trait包含一个方法into_iter,该方法返回一个实现了lterator Trait的迭
代器。

通常,当你有一个类型,希望能够对其进行迭代时,你会实现Intolterator Trait
来提供将该类型转换为迭代器的方法。

Iterator Trait

  • lterator是Rust标准库中的Trait,定义了一种访问序列元素的方式。

  • 它包含了一系列方法,如nextmapfiltersum等,用于对序列进行不同类型的操作。

  • 通过实现lterator Trait,你可以创建自定义的迭代器,以定义如何迭代你的类型中的元素。

pub trait Iterator {
  type Item;
  fn next (&mut self) -> Option<Self::Item>;
}

源码中经常出现的Iter

  • Iter是lterator Trait的一个具体实现,通常用于对集合中的元素进行迭代。

  • 在Rust中,你会经常看到Iter,特别是在对数组、切片等集合类型进行迭代时。

  • 通过Intolterator Trait,你可以获取到一个特定类型的迭代器,比如Iter,然后可以使用Iterator Trait的方法进行操作。

fn main(){
    let array = [1,2,3,4,5];
    let iter = array.iter();
    let sum: i32 = iter.sum();
    println!("{sum}");
    
    let text = "hello world";
    let iter = text.chars();
    let uppercase: String = iter.map(|c| c.to_ascii_uppercase()).collect::<String>();
    
    println!("{}", uppercase);
    println!("{:?}", text);
}

获取迭代器的三种方法

iter()

iter()方法返回一个不可变引用的迭代器,用于只读访问集合的元素

该方法适用于你希望在不修改集合的情况下迭代元素的场景。

iter_mut()

iter_mut() 方法返回一个可变引用的迭代器,用于允许修改集合中的元素。

该方法适用于你希望在迭代过程中修改集合元素的场景

into_iter()

into_iter()方法返回一个拥有所有权的迭代器,该迭代器会消耗集合本身,将所有权转移到迭代器。

该方法适用于你希望在迭代过程中拥有集合的所有权,以便进行消耗性的操作,如移除元素

自定义类型实现iter、iter_mut、into_iter()

#[derive(Debug)]
struct Stack<T> {
    items: Vec<T>,
}

impl<T> Stack<T> {
    fn new() -> Self {
        Stack{items: Vec::new()}
    }
    
    // 入栈
    fn push(&mut self, item: T) {
        self.items.push(item);
    }
    
    // 出栈
    fn pop(&mut self) -> Option<T> {
        self.items.pop()
    }
    
    // 不可变引用
    fn iter(&self) -> std::slice::Iter<T> {
        self.items.iter()
    }
    
    fn iter_mut(&mut self) -> std::slice::IterMut<T> {
        self.items.iter_mut()
    }
    
    fn into_iter(self) -> std::vec::IntoIter<T> {
        self.items.into_iter()
    }
}

fn main() {
    let mut my_stack = Stack::new();
    my_stack.push(1);
    my_stack.push(2);
    my_stack.push(3);
    
    for item in my_stack.iter() {
        println!("Item: {item}");
    }
    
    println!("{:?}", my_stack);
    
    for item in my_stack.iter_mut() {
        *item *= 2;
    }
    
    println!("{:?}", my_stack);
    
    for item in my_stack.into_iter() {
        println!("{}", item);
    }
 
}

标签:mut,入门,迭代,sum,iter,简易,let,fn,Rust
From: https://www.cnblogs.com/moguw/p/18155733/rust-base-7

相关文章

  • 我为什么学习Rust编程?
    2024-04-24下午,今下午感受到如果要睡觉就应该让音响在自己耳边程序轰炸.翻看gitee,又再次看到这个loop示例,这几天忙于工作,除了偶尔刷下rust视频,rust的电子书,其他的都看得比较少,主要还是感觉工作疲倦之余已经没有精力来继续回顾和延伸.其实后来感觉不是的,就像那会儿接......
  • Python GUI开发- PyQt5 开发小工具环境入门
    前言常见的python开发gui的库有Tkinter,PyQt5,wxPython等。本教程是选择PyQt5开发桌面小工具。环境准备只需pip安装即可快速准备好开发环境pipinstallpyqt5快速开始创建一个空的window窗口Qapplication():每个GUI都必须包含一个Qapplication,argv表示获取命令行参数,如果......
  • 使用SSH从公网服务器简易使用内网任意机器服务,比如从外部下载代码
    如果有一个台外部的机器waibu-host,位于阿里云,腾讯云,亚马逊,azure云等等; 假设你想从这个waibu-host上访问公司任意服务,下载代码,访问http服务,等等,或者你机器上的服务,不需要额外工具,只要ssh反向就可以实现; 借个图,如下: 举个例子,如果你想从公司内部......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-40-录制生成脚本
    1.简介各种自动化框架都会有脚本录制功能,playwright这么牛叉当然也不例外。很早之前的selenium、Jmeter工具,发展到每种浏览器都有对应的录制插件。今天我们就来看下微软自动化框架playwright是如何录制脚本的。很多小伙伴或者童鞋们会觉得奇怪,怎么现在才将录制生成脚本啊,要是早......
  • Python基于opencv实现的人脸识别--入门项目
    先去opencv官网下载人脸识别的训练集https://opencv.org/releases/解压目录要记录主要使用haarcascade_frontalface_default.xml摄像头录入人脸(可选)可以弄一个文件夹,里面放一堆图片importcv2face_name='xxxx'#该人脸的名字#加载OpenCV人脸检测分类器face_cas......
  • Docker从入门到精通:Docker log 命令学习
    前言在使用Docker进行应用程序容器化的过程中,日志管理是一个至关重要的方面。通过有效地管理容器的日志,我们可以快速诊断问题、监视应用程序的运行状况以及确保系统的健康运行。Docker提供了强大的日志管理功能,而dockerlog命令则是我们在日常工作中经常使用的工具之一。本......
  • Rust所有权__Ownership Rules
    First,let’stakealookattheownershiprules.Keeptheserulesinmindaswethroughtheexamplesthatillustratethem:     EachvalueinRusthasanowner.     Therecanonlybeoneowneratatime.     Whentheownergoesoutofsc......
  • 【rust】《Rust深度学习[6]-简单实现逻辑回归(Linfa)》
    什么是LinfaLinfa是一组Rust高级库的集合,提供了常用的数据处理方法和机器学习算法。Linfa对标Python上的 scikit-learn,专注于日常机器学习任务常用的预处理任务和经典机器学习算法,目前Linfa已经实现了scikit-learn中的全部算法。项目结构依赖[package]name="rust-ml-e......
  • .net 连接数据库sql-server 基础入门
    usingSystem.Data;usingSystem.Data.SqlClient;classPranson(){publicstaticvoidMain(){//创建数据库链接对象stringconnString="Server=.;DataBase=CourseManageDB;Uid=sa;Pwd=123456";SqlConnectionconn=newSqlConn......
  • 【rust】《Rust深度学习[4]-理解线性网络(Candle)》
    全连接/线性在神经网络中,全连接层,也称为线性层,是一种层,其中来自一层的所有输入都连接到下一层的每个激活单元。在大多数流行的机器学习模型中,网络的最后几层是完全连接的。实际上,这种类型的层执行基于在先前层中学习的特征输出类别预测的任务。全连接层的示例,具有四个输入节点......