[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

相关文章

Rust中的注释使用解读

《Rust中的注释使用解读》本文介绍了Rust中的行注释、块注释和文档注释的使用方法,通过示例展示了如何在实际代码中应用这些注释,以提高代码的可读性和可维护性... 目录Rust 中的注释使用指南1. 行注释示例:行注释2. 块注释示例:块注释3. 文档注释示例:文档注释4. 综合示例总结Rust 中的注释

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

迭代器模式iterator

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