在Rust語言中,結構體是一種用戶自定義的數據類型,它允許你將多個相關的值組合成一個單一的類型。結構體是一種複合數據類型,可以用來封裝多個不同類型的字段,這些字段可以是基本數據類型、其他結構體、枚舉類型等。通過使用結構體,你可以創建更複雜的數據結構,並定義它們的行爲。
結構體的定義在Rust中,可以使用struct關鍵字來定義結構體。結構體的基本形式如下。
struct StructName {
field1: FieldType1,
field2: FieldType2,
// 更多字段
}
注意:與C/C++不同,Rust裏的struct語句僅用來定義,不能聲明實例;struct的結尾不需要分號,且每個字段定義之後用逗號進行分隔。
在下面的示例代碼中,我們定義了一個結構體Person。它有兩個字段,一個字段爲name,字符串類型,另一個字段爲age,32位整型。
struct Person { name: String, age: i32,}
結構體的使用要使用結構體,我們需要先創建結構體的實例(即對象)。創建方法爲:使用結構體名稱並跟上大括號{},在大括號中指定每個字段的值。具體可參考下面的示例代碼。
let person = Person{name: String::from("Mike"), age: 16};
如果我們想要賦值的變量名稱與結構體中的字段名稱完全相同,則可以省略字段名稱。否則,編譯時會提示錯誤信息:unknown field。
struct Person {
name: String,
age: i32,
}
fn main() {
let name = String::from("Mike");
let age = 16;
let person = Person{name, age};
let name2 = String::from("Jack");
// name2與結構體中的name不相同,會提示編譯錯誤:unknown field
let person2 = Person{name2, age};
}
創建好結構體的實例後,我們可以通過點號.來訪問結構體字段。
println!("{}: {}", person.name, person.age);
結構體的字段可以是可變的,也可以是不可變的。默認情況下,結構體的字段不可變。如果需要修改結構體的字段,需要使用mut關鍵字讓其成爲可變。
struct Point { x: i32, y: i32,}fn main() { let p = Point { x: 100, y: 200 }; // 編譯報錯:cannot assign p.x = 15; // 使用mut關鍵字後,可修改結構體的字段 let mut p2 = Point { x: 100, y: 200 }; p2.x = 15;}
結構體綁定方法在Rust中,結構體可以綁定方法。這些方法與結構體緊密關聯,允許你以面向對象的方式操作結構體的實例。方法定義在impl塊中,該塊指定了方法所屬的類型。我們結合下面的示例代碼,來進一步說明結構體如何綁定方法,以及如何使用這些方法。
struct Rectangle { width: u32, height: u32,}impl Rectangle { fn new(width: u32, height: u32) -> Self { Self { width, height } } fn area(&self) -> u32 { self.width * self.height } fn print_basic_info() { println!("This is a rectangle"); }}fn main() { Rectangle::print_basic_info(); let rect = Rectangle::new(66, 10); let area = rect.area(); println!("Area: {}", area);}
在上面的示例代碼中,我們爲Rectangle結構體定義了三個方法。
new:這是一個靜態方法,用于創建並返回一個新的Rectangle實例,對應C++、Java等面向對象編程語言中的構造函數。它使用了Self關鍵字來指代結構體自身,這是一種在Rust中引用當前實現類型的方式。
area:這個方法是一個實例方法,用于計算並返回矩形的面積。它接受一個指向Rectangle實例的不可變引用&self作爲參數,這樣它就可以訪問實例的字段了。
print_basic_info:這個方法也是一個靜態方法,用于打印矩形的基本信息。
在main函數中,我們通過構造函數創建了一個Rectangle的實例,並調用了它的area方法來計算面積。注意:方法的第一個參數通常是一個指向結構體實例的引用(&self、&mut self),這允許方法訪問和修改結構體實例的字段。在這個例子中,我們使用的是不可變引用&self,因爲我們只讀取字段的值而不修改它們。如果我們需要修改字段,我們會使用可變引用&mut self。
總結一下:綁定到結構體的方法提供了一種面向對象的方式來操作數據,即使Rust是一種基于函數的編程語言,而不是傳統的面向對象語言。
結構體更新語法在Rust中,如果你想從一個現有的結構體實例創建另一個新的實例,並在此過程中更新某些字段的值,你可以使用結構體的更新語法。這種語法使用..運算符(也稱爲點運算符或展開運算符),允許你複制一個現有的結構體實例,並僅更改你需要修改的字段。
struct Person { name: String, age: u32, city: String,}fn main() { let person1 = Person { name: String::from("Tank"), age: 23, city: String::from("London"), }; let person2: Person = Person { name: String::from("Mike"), ..person1 }; println!("name: {0}, age: {1}, city: {2}", person2.name, person2.age, person2.city);}
在上面的示例代碼中,person1是一個Person類型的實例。我們想要創建一個新的Person實例person2,它的 age和city字段與person1相同,但name字段需要更新爲"Mike"。通過使用..運算符,我們就不需要手動複制age和city字段的值,而只需要指定要更新的name字段。