Rust編程進階:053、封裝

1、創建文件夾learn_oo1,創建Cargo.toml:

mkdir learn_oo1
cd learn_oo1
nano Cargo.toml

2、編輯Cargo.toml,文件內容如下:

[workspace]
members = ["getaver", "main"]

3、創建主程序main和庫getaver:

cargo new main
cargo new getaver --lib

4、編輯getaver/src/lib.rs,文件內容如下:

pub struct AverCollect {
    list: Vec<i32>,
    aver: f64,
}

impl AverCollect {
    pub fn new() -> AverCollect {
        AverCollect {
            list: vec![],
            aver: 0.0,
        }
    }

    pub fn add(&mut self, value: i32) {
        self.list.push(value);
        self.update_average();
    }

    pub fn remove(&mut self) -> Option<i32> {
        let result = self.list.pop();
        match result {
            Some(value) => {
                self.update_average();
                Some(value)
            }
            None => None,
        }
    }

    pub fn average(&self) -> f64 {
        self.aver
    }

    fn update_average(&mut self) {
        let total: i32 = self.list.iter().sum();
        self.aver = total as f64 / self.list.len() as f64;
    }
}

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}

5、編輯main/Cargo.toml,在[dependencies]下面添加一行:

getaver = {path = "../getaver"}

6、編輯main/src/main.rs,文件內容如下:

use getaver;

fn main() {
    let mut a = getaver::AverCollect::new();

    a.add(1);
    println!("average = {}", a.average());

    a.add(2);
    println!("average = {}", a.average());

    a.add(3);
    println!("average = {}", a.average());

    a.remove();
    println!("average = {}", a.average());
}

Rust裏面沒有繼承的概念,可以通過tait來進行行爲共享:

trait A {
    fn sum() {
        // todo
    }
}

struct XXX {}

impl A for XXX {}

本節全部源代碼:
https://github.com/anonymousGiga/learn_rust/tree/master/learn_oo1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章