study_rust_example/iterator_closure/
iterator_process_study.rs1fn iterator_vector(v: &Vec<i32>) {
2 let v_iter = v.iter();
3 for val in v_iter {
4 println!("iterator_vector:: val = {val}");
5 }
6 let mut v_iter_into = v.into_iter();
9 assert_eq!(v_iter_into.next(), Some(&1));
10 assert_eq!(v_iter_into.next(), Some(&2));
11 assert_eq!(v_iter_into.next(), Some(&3));
12 assert_eq!(v_iter_into.next(), Some(&4));
13 assert_eq!(v_iter_into.next(), Some(&5));
14 assert_eq!(v_iter_into.next(), Some(&6));
15 assert_eq!(v_iter_into.next(), None);
16}
17
18fn iterator_mute_vector(v: &mut Vec<i32>) {
19 let v_mute_iter = v.iter_mut();
20 for value in v_mute_iter {
21 *value = *value * 2;
22 }
23 println!("value_vector {:?}", v);
24}
25
26fn iterator_consume_method(v: &Vec<i32>) {
27 let v_iter = v.iter();
28 let total: i32 = v_iter.sum();
29 assert_eq!(total, 42);
30 println!("total {total}");
31}
32
33fn produce_iterator_method(v: &Vec<i32>) {
34 let v2: Vec<_> = v.iter().map(|x| x + 1).collect();
35 println!("produce_iterator_method vec: {:?}", v2);
36}
37
38pub fn iterator_usage() {
39 let mut v1 = vec![1, 2, 3, 4, 5, 6];
40 iterator_vector(&v1);
41 iterator_mute_vector(&mut v1);
42 println!("iterator_usage {:?}", v1);
43 iterator_consume_method(&v1);
44 produce_iterator_method(&v1);
45}
46
47#[derive(Debug, PartialEq)]
48struct Shoe {
49 size: u32,
50 style: String,
51}
52
53fn shoe_in_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
54 shoes.into_iter().filter(|s| s.size == shoe_size).collect()
55}
56
57#[cfg(test)]
58mod tests {
59 #[test]
60 fn test_iterator_demo() {
61 let v1 = vec![1, 2, 3];
62 let mut v1_iter = v1.iter();
66 assert_eq!(v1_iter.next(), Some(&1));
67 assert_eq!(v1_iter.next(), Some(&2));
68 assert_eq!(v1_iter.next(), Some(&3));
69 assert_eq!(v1_iter.next(), None);
70 }
71
72 #[test]
73 fn test_shoe_in_size() {
74 use super::*;
75 let shoes = vec![
76 Shoe {
77 size: 10,
78 style: String::from("sneaker"),
79 },
80 Shoe {
81 size: 13,
82 style: String::from("sandal"),
83 },
84 Shoe {
85 size: 10,
86 style: String::from("boot"),
87 },
88 ];
89 let in_my_size = shoe_in_size(shoes, 10);
90 assert_eq!(
91 in_my_size,
92 vec![
93 Shoe {
94 size: 10,
95 style: String::from("sneaker"),
96 },
97 Shoe {
98 size: 10,
99 style: String::from("boot"),
100 },
101 ]
102 )
103 }
104}