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
38fn 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