#[cfg(test)] mod tests { #[test] fn iterator_domonstration() { let v1 = vec![1, 2, 3]; let mut v1_iter = v1.iter(); assert_eq!(v1_iter.next(), Some(&1)); assert_eq!(v1_iter.next(), Some(&2)); assert_eq!(v1_iter.next(), Some(&3)); } #[test] fn iterator_sum() { let v1 = vec![1, 2, 3]; let mut v1_iter = v1.iter(); let total: i32 = v1_iter.sum(); assert_eq!(total, 6); } #[test] fn iterator_map() { let v1 = vec![1, 2, 3]; let v2: Vec<_> = v1.iter().map(|x| x + 1).collect(); assert_eq!(v2, vec![2, 3, 4]); } #[derive(PartialEq, Debug)] struct Shoe { size: u32, style: String, } fn shoes_in_my_size(shoes: Vec, shoe_size: u32) -> Vec { shoes.into_iter().filter(|x| x.size == shoe_size).collect() } #[test] fn filter_by_size() { let shoes = vec![ Shoe { size: 10, style: String::from("sneaker"), }, Shoe { size: 32, style: String::from("sandal"), }, Shoe { size: 39, style: String::from("yeezy"), }, Shoe { size: 40, style: String::from("boot"), }, ]; let in_my_size = shoes_in_my_size(shoes, 39); assert_eq!( in_my_size, vec![Shoe { size: 39, style: String::from("yeezy"), }] ); } struct Counter { count: u32, } impl Counter { fn new() -> Counter { Counter { count: 0 } } } impl Iterator for Counter { type Item = u32; fn next(&mut self) -> Option { if self.count < 5 { self.count += 1; Some(self.count) } else { None } } } #[test] fn iterator_counter() { 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); } #[test] fn useing_other_iterator_trait_methods() { let sum: u32 = Counter::new() // 略过1这个元素 .zip(Counter::new().skip(1)) .map(|(a, b)| a * b) .filter(|x| x % 3 == 0) .sum(); assert_eq!(sum, 18); } }