1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
use core::fmt; use std::option; #[derive(PartialEq, Debug)] pub struct Shoe { pub size: u32, pub style: String, } pub struct Counter { count: u32 } impl Counter { pub fn new() -> Counter { Counter { count: 0} } } impl Iterator for Counter { type Item = u32; fn next(&mut self) -> Option<Self::Item> { self.count += 1; if self.count < 6 { Some(self.count) } else { None } } } pub fn shoe_in_my_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> { println!("size: {}", shoe_size); shoes.into_iter().filter(|s|s.size == shoe_size).collect() } #[test] fn filters_by_size() { let shoes = vec![ Shoe {size: 40, style: String::from("特步")}, Shoe {size: 41, style: String::from("耐克")}, Shoe {size: 40, style: String::from("安踏")}, ]; assert_eq!(shoe_in_my_size(shoes, 40), vec![ Shoe {size:40, style:String::from("特步")}, Shoe {size:40, style: String::from("安踏")}, ]) } #[test] fn test_counter() { let mut c = Counter::new(); assert_eq!(c.next(), Some(1)); assert_eq!(c.next(), Some(2)); assert_eq!(c.next(), Some(3)); assert_eq!(c.next(), Some(4)); assert_eq!(c.next(), Some(5)); assert_eq!(c.next(), None); } #[test] fn using_other_iterator_trait_methods() { let sum: u32 = Counter::new().zip(Counter::new().skip(1)) .map(|(a,b)| a * b) .filter(|x| x % 3 == 0) .sum(); assert_eq!(18, sum); }