[rust-011]Rust的Iterator和生命周期

2024-06-11 08:48
文章标签 rust 生命周期 iterator 011

本文主要是介绍[rust-011]Rust的Iterator和生命周期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主要为了解释这段代码:

impl Condition {/// Returns an iterator over only the variable tests, along with/// their indices./// 这个语法的解释可以参考这里 https://blog.katona.me/2019/12/29/Rust-Lifetimes-and-Iterators/fn variables(&self) -> impl Iterator<Item = (usize, VariableID)> + '_ {self.0.iter().enumerate().filter_map(|(i, test)| match test {ConditionTest::Variable(id) => Some((i, *id)),ConditionTest::Constant(_) => None,})}
}

这里有三个问题:

  • Iterator
  • -> impl
  • + '_

1.Iterator

参考文档 https://doc.rust-lang.org/book/ch13-02-iterators.html

最简单的用法

fn main(){let v1 = vec![1, 2, 3];//常规操作for val in v1.iter() {println!("Got: {}", val);}//求和,注意需要有::<i32>,否则会报错println!("sum = {}", v1.iter().sum::<i32>());//这里有map,由于iter是懒惰求值,必须有collect()才能生成有值的v2let v2: Vec<_> = v1.iter().map(|x| x + 1).collect();println!("v2 = {:#?}", v2)
}

实现Iterator trait:

struct Counter {count: u32,
}impl Counter {fn new() -> Counter {Counter { count: 0 }}
}impl Iterator for Counter {type Item = u32;fn next(&mut self) -> Option<Self::Item> {if self.count < 5 {self.count += 1;//Some是Option<T>枚举Some(self.count)} else {//None是Option<T>枚举None}}
}fn main() {let mut counter = Counter::new();assert_eq!(counter.next(), Some(1));assert_eq!(counter.next(), Some(2));assert_eq!(counter.next(), Some(3));assert_eq!(counter.next(), Some(4));assert_eq!(counter.next(), Some(5));assert_eq!(counter.next(), None);
}

2.在返回值实现Iterator trait

参考文献:https://doc.rust-lang.org/nightly/edition-guide/rust-2018/trait-system/impl-trait-for-returning-complex-types-with-ease.html

trait Trait {}impl Trait for i32 {}fn returns_a_trait_object() -> impl Trait {5
}fn main(){let x = returns_a_trait_object();
}


//第一种情况,返回值实现了Iterator特质,其中,Iterator的Item是str
fn to_words<'a>(text: &'a str) -> impl Iterator<Item = &'a str> {//实际上这是split返回的Iteratortext.split(' ')
}#[derive(Debug)]
struct AStruct{x:i32,y:i32,
}impl AStruct{fn new() -> Self{Self{x:1,y:2}}fn get_iter_str<'a>(&self, text:&'a str) -> impl Iterator<Item = &'a str> {text.split(' ')}}fn main() {let text = "word1 word2 word3";for i in to_words(text){println!("{}", i);}println!("{}", to_words("abc def ghi jkl").take(2).count());let ast = AStruct::new();println!("ast count = {:?}", ast.get_iter_str("sdff").count());
}

3.关于+'_

参考文献

  • https://blog.katona.me/2019/12/29/Rust-Lifetimes-and-Iterators/ 完整的例子介绍
  • https://doc.rust-lang.org/edition-guide/rust-2018/trait-system/impl-trait-for-returning-complex-types-with-ease.html#return-position 返回值实现trait
  • https://doc.rust-lang.org/nightly/edition-guide/rust-2018/ownership-and-lifetimes/the-anonymous-lifetime.html 匿名lifetime '_
fn variables(&self) -> impl Iterator<Item = (usize, VariableID)> + '_ {self.0.iter().enumerate().filter_map(|(i, test)| match test {ConditionTest::Variable(id) => Some((i, *id)),ConditionTest::Constant(_) => None,})}

函数variables是Condition的成员函数。函数的返回值必须实现了Iterator特质,Iterator的type是tuple (usize, VariableID),后面的"+'_"表示,返回值的生命周期是Condition对象的生命周期。

 

 

这篇关于[rust-011]Rust的Iterator和生命周期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050699

相关文章

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

【Vue】关于Vue3的生命周期

目录 Vue3中新增了一个setup生命周期函数:(1) setup执行的时机是在beforeCreate生命周期函数之前执行,在setup函数中是不能通过this来获取实例的;(2) 为了命名的统一性,将beforeDestroy 改名为 beforeUnmount,destroyed 改名为 unmounted 生命周期函数: setup —— 不能通过this来获

09 生命周期

生命周期 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestorydestoryed 辣子鸡:香辣入口,犹如吃了炫迈一样 - - - 根本停不下来 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"

Maven生命周期:深入理解构建过程

目录 1. Maven生命周期简介 2. 默认生命周期的阶段 3. 清理生命周期 4. 站点生命周期 5. Maven生命周期的灵活性 6. 结论         在Java开发中,Maven是一个不可或缺的工具,它通过自动化项目的构建、依赖管理和文档生成等任务,极大地提高了开发效率。Maven的核心之一是其构建生命周期,它定义了项目构建过程中的一系列阶段。在这篇文章中,我们将深

【前端】animation动画以及利用vue制作简单的透明度改变动画,包含vue生命周期实现

一. 问题描述 想做一个文字透明度从1到0然后再从0到1的css动画。 二. 代码写法 2.1 animation写法 2.1.1 animation属性key 2.1.2 代码展示 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=de

【C++多线程编程】 线程安全与对象生命周期管理

目录 类的线程安全 实现线程安全  构造函数在多线程中的安全性 析构函数多线程环境的安全 智能指针实现多线程安全  shared_ptr 非完全线程安全 shared_ptr可能导致对象生命周期延长 const引用可以减少传递shared_ptr开销 shared_ptr 智能指针块模块的优点  析构所在线程问题分析  RAII的使用 enable_shared_from_