學習軌道
/
Rust
Rust
/
練習
/
健康統計
健康統計

健康統計

學習練習

簡介

把一群項目組成一個集合,並將這些集合當成單位來處理,往往很實用。在 Rust 中,我們把這樣的集合稱為結構體,而其中每一個項目就是結構體的欄位。結構體定義了可用的欄位集合,而結構體的某個具體例子則稱為實例。

此外,結構體可以定義方法,這些方法能夠存取它的欄位。在這種情況下,結構體本身會以 self 表示。當方法使用 &mut self 時,欄位可以被變更,也就是可變的;當方法使用 &self 時,欄位無法變更,也就是不可變。控制可變性能幫助借用檢查器確保某些整類的並行 bug 在 Rust 中根本不會發生。

在這個練習中,你會在結構體上實作兩種方法。第一種通常稱為 getter,它們把結構體的欄位對外公開,卻不讓其他人修改那個值。在 Rust 中,這類方法依慣例會與它們所公開的欄位同名,也就是說,如果我們有一個 getter 方法要取得名為 name 的結構體欄位,這個方法就直接叫做 name()。

你還會實作另一種類型的方法,通常稱為 setter。這類方法會改變欄位的值。setter 在 Rust 中並不常見。如果欄位可以自由修改,更常見的做法就是直接把它設為公開,不過,如果更新欄位需要產生副作用,或是為了存取控制,setter 就很有用:標記為 pub(crate) 的 setter 允許同一個 crate 內的其他模組更新私有欄位,而這個欄位不會受到外界影響。

結構體有三種:具名欄位結構體、元組結構體,以及單元結構體。在這個概念練習中,我們會探索第一種:具名欄位結構體。

結構體使用 struct 關鍵字定義,後面接著這個結構體所描述型別的大寫名稱:

struct Item {}

接著把其他型別帶進結構體主體,成為結構體的_欄位_,每個欄位都有自己的型別:

struct Item {
    name: String,
    weight: f32,
    worth: u32,
}

最後,可以在 impl 區塊中為結構體定義方法:

impl Item {
    // initializes and returns a new instance of our Item struct
    fn new() -> Self {
        todo!()
    }
}

簡單介紹完結構體的語法之後,就接著看看這個練習的說明吧!

說明

你正在開發一套健康監測系統。為此,你需要追蹤使用者的健康統計資料。

你會從impl區塊中一些尚未實作的函式開始,另外還有以下的 struct 定義:

pub struct User {
    name: String,
    age: u32,
    weight: f32,
}

你的目標是實作impl區塊中User struct裡那些尚未實作的方法。

例如,new方法應該回傳一個User實例,並帶有指定的名稱、年齡和體重值。

let mut bob = User::new(String::from("Bob"), 32, 155.2);
// Returns: a User with name "Bob", age 32, and weight 155.2

weight方法應該回傳User的體重。

bob.weight();
// Returns: 155.2

set_age方法應該設定User的年齡。

bob.set_age(33);
// Updates Bob's age to 33; happy birthday Bob!

祝你玩得開心!

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Rust Exercism

準備好開始 健康統計 了嗎?

註冊 Exercism,透過 99 個練習 和真人引導來學習並精通 Rust,全部免費。