aolifu_rust/
iterator.rs

1pub fn print_iterator() {
2    let v1 = vec![1,2,3];
3    let iterator1 = v1.iter();
4    for item in iterator1 {
5        println!("{}", item)
6    }
7}
8
9#[test]
10pub fn iterator_demonstration() {
11    let v1 = vec![1,2,3];
12    let mut  iterator1 = v1.iter();
13    assert_eq!(iterator1.next(), Some(&1));
14    assert_eq!(iterator1.next(), Some(&2));
15    assert_eq!(iterator1.next(), Some(&3));
16}
17
18#[test]
19pub fn iterator_sum() {
20    let v1 = vec![1,2,3];
21    let sum: i32 = v1.iter().sum();
22    println!("sum: {}", sum)
23}
24
25#[test]
26pub fn iterator_adapter() {
27    let v1 = vec![1,2,3];
28    let v2: Vec<_> = v1.iter().map(|x| x + 1).collect();
29    assert_eq!(v2, vec![2,3,4])
30}
31
32#[derive(PartialEq, Debug)]
33struct Shoe {
34    size: u32,
35    style: String,
36}
37
38// take ownership
39fn shoes_in_my_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
40    shoes.into_iter().filter(|x| x.size == shoe_size).collect()
41}
42
43#[test]
44fn filter_by_size() {
45    let shoes = vec![
46        Shoe {
47            size: 10,
48            style: String::from("sneaker"),
49        },
50        Shoe {
51            size: 13,
52            style: String::from("sandal"),
53        },
54        Shoe {
55            size: 10,
56            style: String::from("boot"),
57        }
58    ];
59    let in_my_size = shoes_in_my_size(shoes, 10);
60    assert_eq!(in_my_size, vec![
61        Shoe {
62            size: 10,
63            style: String::from("sneaker"),
64        },
65        Shoe {
66            size: 10,
67            style: String::from("boot"),
68        }
69
70    ])
71}
72
73struct Counter{
74    count: u32
75}
76
77impl Counter {
78    fn New() -> Counter {
79        Counter {
80            count: 0
81        }
82    }
83}
84
85impl Iterator for Counter {
86    type Item  = u32;
87    fn next(&mut self) -> Option<Self::Item> {
88        if self.count < 5 {
89            self.count += 1;
90            Some(self.count)
91        } else {
92            None
93        }
94    }
95}
96
97#[test]
98fn calling_next_directly() {
99    let mut  counter = Counter::New();
100    assert_eq!(counter.next(), Some(1));
101    assert_eq!(counter.next(), Some(2));
102    assert_eq!(counter.next(), Some(3));
103    assert_eq!(counter.next(), Some(4));
104    assert_eq!(counter.next(), Some(5));
105    assert_eq!(counter.next(), None);
106}
107
108#[test]
109fn using_other_iterator_trait_methods() {
110    let sum: u32 = Counter::New()
111        .zip(Counter::New().skip(1))
112        .map(|(a,b)| a * b)
113        .filter(|x| x % 3 == 0)
114        .sum();
115    assert_eq!(sum, 18);
116}
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132