Rust基礎06-結構體
阿新 • • 發佈:2022-03-27
Struct 例項
-
計算長方形面積
#[derive(Debug)] struct Rectangle { width: u32, length: u32, } fn main() { let rect = Rectangle { width: 30, length: 50, }; println!("{}", area(&rect)); println!("{:#?}", rect); } fn area(rect: &Rectangle) -> u32 { rect.width * rect.length }
在上述程式碼中,如果我們直接使用
println!("{}", rect);
來列印 Rectangle 例項,程式會報錯,見下:error[E0277]: `Rectangle` doesn't implement `std::fmt::Display`
相關解釋見圖:
因此,我們在程式中使用
println!("{:#?}", rect);
來實現列印 Rectangle 例項,在程式第一行寫下#[derive(Debug)]
相關解釋見圖:
更多相關資訊見:
Struct 方法
-
方法與函式
相似:fn 關鍵字、名稱、引數、返回值
不同:- 方法是在 struct (或 enum、trait 物件) 的上下文中定義
- 第一個引數為 self,表示方法被呼叫的 struct 例項
-
定義方法:
在 impl 塊中定義方法
方法的第一個引數可以是 &self,也可以獲得其所有權 或 可變借用,與其他引數一樣
//例項:長方體面積 #[derive(Debug)] struct Rectangle { width: u32, length: u32, } //定義方法 impl Rectangle { fn area(&self) -> u32 { self.width * self.length } } fn main() { let rect = Rectangle { width: 30, length: 50, }; println!("{}", rect.area()); println!("{:#?}", rect); }
-
方法呼叫運算子:
在 C/C++ 中,我們可以通過如下呼叫方法:
object -> something() (*object).something()
在 Rust 中,沒有 -> 運算子,但 Rust 會自動引用或解引用
在呼叫方法時就會發生這種行為,Rust 根據情況自動新增 &、&mut 或 ,以便 object 可以匹配方法的簽名
p1.distance(&p2); (&p1).distance(&p2);
-
關聯函式:
可以在 impl 塊中定義不把 self 作為第一個引數的函式,它們叫關聯函式(不是方法)
如:String::from()
關聯函式通常用於構造器
//例項:長方形體積->impl中定義的關聯函式 fn square(size: u32) -> Rectangle { Rectangle { width: size, length: size } }
-
impl 塊:
每個 struct 允許擁有多個 impl 塊