study_example/object_oriented/
object_oriented_feature.rs

1#[derive(Debug)]
2pub struct AveragedCollection {
3    list: Vec<i32>,
4    average: f64,
5}
6
7impl AveragedCollection {
8    fn update_average(&mut self) {
9        let total: i32 = self.list.iter().sum();
10        self.average = (total as f64) / (self.list.len() as f64);
11    }
12
13    pub fn remove(&mut self) -> Option<i32> {
14        let result = self.list.pop();
15        match result {
16            None => None,
17            Some(value) => {
18                self.update_average();
19                Some(value)
20            }
21        }
22    }
23
24    pub fn add(&mut self, value: i32) {
25        self.list.push(value);
26        self.update_average();
27    }
28}
29
30/// 运行结果如下
31/// ```txt
32/// average_collect init: AveragedCollection { list: [12, 34, 53, 98], average: 49.25 }
33/// average_collect after add: AveragedCollection { list: [12, 34, 53, 98, 46], average: 48.6 }
34/// average_collect after remove: AveragedCollection { list: [12, 34, 53, 98], average: 49.25 }
35/// ```
36pub fn object_oriented_feature_study() {
37    let mut average_collect = AveragedCollection {
38        list: vec![12, 34, 53, 98],
39        average: (12 + 34 + 53 + 98) as f64 / 4 as f64,
40    };
41    println!("average_collect init: {:?}", average_collect);
42    average_collect.add(46);
43    println!("average_collect after add: {:?}", average_collect);
44    average_collect.remove();
45    println!("average_collect after remove: {:?}", average_collect);
46}