把一群項目組成一個集合,並將這些集合當成單位來處理,往往很實用。在 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!
祝你玩得開心!