标签:迭代 0025 value next let iter usize Rust
环境
- Time 2022-05-21
- Rust 1.61.0
前言
说明
参考:https://doc.rust-lang.org/std/iter/trait.IntoIterator.html
目标
前一节自定义了一个类型来实现迭代器,并且自定义了一个方法来转化成迭代器。标准库中提供了一个转化成迭代器 trait
。
自定义类型
struct MyData {
value1: usize,
value2: usize,
value3: usize,
value4: usize,
}
Default
impl Default for MyData {
fn default() -> Self {
Self {
value1: 88,
value2: 44,
value3: 66,
value4: 22,
}
}
}
实现迭代器
#[derive(Debug)]
struct MyIterator(Vec<usize>);
impl Iterator for MyIterator {
type Item = usize;
fn next(&mut self) -> Option<Self::Item> {
self.0.pop()
}
}
生成迭代器
impl IntoIterator for MyData {
type Item = usize;
type IntoIter = MyIterator;
fn into_iter(self) -> Self::IntoIter {
let vec = vec![self.value4, self.value3, self.value2, self.value1];
MyIterator(vec)
}
}
使用迭代器
fn main() {
let mut iter = MyData::default().into_iter();
while let Some(value) = iter.next() {
println!("value: {value:?}")
}
println!("{iter:?}")
}
for 语法糖
因为实现了 IntoIterator
trait 的可以直接使用 for 遍历,所以可以简写。
fn main() {
for value in MyData::default() {
println!("value: {value:?}")
}
}
for 去糖后
fn main() {
let result = match IntoIterator::into_iter(MyData::default()) {
mut iter => loop {
let next;
match iter.next() {
Some(val) => next = val,
None => break,
};
let x = next;
let () = {
println!("value: {}", x);
};
},
};
result
}
总结
实现了 IntoIterator
trait,并且使用了 for
语法糖。
附录
标签:迭代,0025,value,next,let,iter,usize,Rust 来源: https://www.cnblogs.com/jiangbo4444/p/16636795.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。