13.迭代器.rs
/*
在Rust中,迭代器共分為三個部分:迭代器、適配器、消費者。
_迭代器_給你一個值的序列
_適配器_操作迭代器,產生一個不同輸出序列的新迭代器
_消費者_操作迭代器,產生最終值的集合
迭代器本身提供了一個惰性的序列,適配器對這個序列進行諸如篩選、拼接、轉換查找等操作,消費者則在前兩者的基礎上生成最后的數值集合更多請看
https://blog.csdn.net/guiqulaxi920/article/details/78823541*/use std::collections::HashMap;//迭代器
fn test_1() {//(1..10) 其本身是一個迭代器for i in 1..10 {print!("{}-", i);}println!("");//寫法2let values = vec![1, 2, 3];for x in &values {print!("{}-", x);}println!("");//寫法3let mut v_iter = values.iter();loop {if let Some(v) = v_iter.next() {print!("{}-", v);} else {break;}}println!("");let mut nums = vec![1, 2, 3, 4, 5];for i in &mut nums {*i *= 2;}println!("{:?}", nums);let nums = vec![1, 2, 3, 4, 5];let nums = nums.iter().map(|x| x * 2);println!("{:?}", nums);//可變迭代let mut v3 = vec![1, 2, 3];let mut v_iter = v3.iter_mut();loop {if let Some(v) = v_iter.next() {*v += 10;} else {break;}}println!("{:?}", v3);
}//適配器
fn test_2() {println!("---------------------------test2-----------------------");//filter()是一個帶有一個閉包參數的適配器for i in (1..10).filter(|&x| x % 2 == 0) {println!("{}", i);}//又是惰性!那個閉包永遠也不會執行。這個例子也不會打印任何數字:(1..100).map(|x| println!("{}", x));let t = (1..100).map(|x| x + 1000);println!("{:?}", t);
}//消費者
fn test_3() {println!("---------------------------test3-----------------------");//collect()從迭代器中取得盡可能多的值,然后返回結果的集合let one_to_one_hundred1 = (1..101).collect::<Vec<i32>>();let one_to_one_hundred2 = (1..101).collect::<Vec<_>>();println!("{:?}", one_to_one_hundred2);//find接收一個閉包,然后處理迭代器中每個元素的引用。這個閉包返回true如果這個元素是我們要找的,返回false如果不是let greater_than_forty_two = (0..100).find(|x| *x > 50);println!("{:?}", greater_than_forty_two);//fold()看起來像這樣:fold(base, |accumulator, element| ...)。它需要兩個參數:第一個參數叫做_基數_(base)。第二個是一個閉包,它自己也需要//兩個參數:第一個叫做_累計數_(accumulator),第二個叫_元素_(element)。每次迭代,這個閉包都會被調用,返回值是下一次迭代的累計數。在我們的第一//次迭代,基數是累計數。let sum = (1..101).fold(1000000000, |sum, x| sum + x);println!("{}", sum);let v1 = vec![1, 2, 3, 4];let v1_iter = v1.iter();let total: i32 = v1_iter.sum();println!("{}", total);
}//定制迭代器
fn test_4() {println!("---------------------------test4-----------------------");struct Counter {count: u32,}impl Counter {fn new() -> Counter {Counter { count: 0 }}}//需要實施迭代器特性impl Iterator for Counter {type Item = u32; //聲明迭代器關聯類型//只需實施nextfn next(&mut self) -> Option<Self::Item> {//需改變自身countself.count += 1;if self.count < 6 {Some(self.count)} else {None}}}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);
}//使用閉合函數
fn test_5() {println!("---------------------------test5-----------------------");let v1: Vec<i32> = vec![1, 2, 3]; //顯示聲明let v2: Vec<_> = v1.iter().map(|x| x + 1).collect(); //轉化成集合, 自動推導類型assert_eq!(v2, vec![2, 3, 4]);println!("{:?}", v2);#[derive(PartialEq, Debug)] //衍生屬性struct Shoe {size: u32,style: String,}let shoes = vec![Shoe {size: 10,style: String::from("sneaker"),},Shoe {size: 13,style: String::from("sandal"),},Shoe {size: 10,style: String::from("boot"),},];fn shoes_in_my_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {shoes.into_iter() //所有權,需要改變迭代器尺寸.filter(|s| s.size == shoe_size) //過濾器,閉合函數讀取環境。//python dict comprehension.collect()}let in_my_size = shoes_in_my_size(shoes, 10);println!("{:?}", in_my_size);
}fn main() {test_1();test_2();test_3();test_4();test_5();println!("---------------------------main-----------------------");let mut map = HashMap::new();map.insert(1, String::from("a"));map.insert(2, String::from("b"));map.insert(3, String::from("c"));let t1 = map.iter().filter(|(k,v)|**k != 1).collect::<Vec<_>>();println!("{:?}",t1);
}
?
總結
- 上一篇: 12.映射表map.rs
- 下一篇: 14.结构体struct.rs