Rust 第21节 迭代器
迭代器模式:对一系列项执行某些任务
迭代器负责:
遍历每个项
确定序列(遍历)何时完成
Rust中的迭代器
如果只声明了迭代器而没有调用迭代器的方法,迭代器是没有工作的,没有效果的
迭代器的使用
let v1 = vec![1,2,3];
let v1_i = v1.iter();
for value in v1_i {
println!("{}",value);
}
Iterator trait
所有迭代器都实现了Iterator Trait
Iterator Trait 仅要求实现一个方法:next
next:
每次返回迭代器中的一项
返回结果包裹在Some中
结束是返回None
也可以手动调用迭代器的next方法
let v1 = vec![1,2,3];
let mut v1_i = v1.iter();
if let Some(x) = v1_i.next() { //next 会改变迭代器的数据,干掉迭代器中的数据
println!("x1 = {}",x);
}
几个迭代器方法
iter方法:在不可变引用上创建迭代器
into_iter方法:创建的迭代器会获得所有权
iter_mut 方法: 创建可变引用迭代器
sum()方法
调用next的方法叫做消耗型适配器
因为调用他们会把迭代器消耗尽
例如sum() 求和
let v1 = vec![1,2,3];
let v1_i = v1.iter();
let sum : i32 = v1_i.sum();//要指定返回的类型
println!("sum = {}",sum);
map()
Iterator trait 上的另外一些方法叫做 “迭代适配器”
把迭代器转换为不同种类的迭代器
map():
接收一个闭包,闭包作用于每一个元素
产生一个新的迭代器
相当于迭代器的所有的数据都作为参数调用该闭包,然后将闭包的结果作为一个新的迭代器
let v1 = vec![1,2,3];
let v1_i = v1.iter();
let y = |x| {
x + 1
};
let y_i = v1_i.map(y);
for value in y_i {
println!("{}",value);
}
collect() 方法
collect():
消耗型适配器,将结果收集到一个集合类型中;(将一个迭代器再变为集合)
集合的类型要手动声明
let v1 = vec![1,2,3];
let v1_i = v1.iter();
let y = |x| {
x + 1
};
let y_i = v1_i.map(y);
let z : Vec<_> = y_i.collect(); //这里_表示Vec中的类型由编译器自己确认
println!("{:?}",z);
filter() 方法
filter 方法
接收一个闭包
这个闭包在遍历迭代器的每个元素时,返回BOOL类型;闭包的参数就是迭代器的数据
如果闭包返回True,当前元素将会包含在filter产生的迭代器中
如果闭包返回false,当前元素将不会包含在filter产生的迭代器中
简单来说就是过滤需要的元素文章来源:https://www.toymoban.com/news/detail-784438.html
struct Data{
name : String,
money : u32,
}
fn filter_data(buff : Vec<Data>,money : u32) -> Vec<Data>{
buff.into_iter().filter(|x|{
x.money == money
}).collect() //过滤每个元素,并将结果组合成集合
}
... main.......
let buff = vec![
Data {
name : "红烧肉".to_string(),
money : 12,
},
Data {
name : "糖醋里脊".to_string(),
money : 15,
},
Data {
name : "红烧排骨".to_string(),
money : 15,
},
];
let v = filter_data(buff, 15);
for data in v.iter() {
println!("{}:{}",data.name,data.money);
}
...........
使用Iterator trait 来创建自定义迭代器
只需要实现next 方法文章来源地址https://www.toymoban.com/news/detail-784438.html
//声明结构体
struct Count {
count : u32,
}
//声明创建方法
impl Count {
fn new(count : u32) -> Count {
Count {
count
}
}
}
//关联 Iterator trait
impl Iterator for Count {
type Item = u32; //告诉成员类型
fn next(&mut self) -> Option<Self::Item> {
if self.count != 0 {
self.count -= 1;
Some(self.count)
} else {
None
}
}
}
.....main....
let mut v = Count::new(15);
if let Some(x) = v.next() {
println!("{}",x);
}
let x = v.into_iter();
for v2 in x {
println!("{}",v2)
}
.................................
到了这里,关于Rust 迭代器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!