30天拿下Rust之結構體

希望睿智 2024-05-18 07:35:36

概述

在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字段。

0 阅读:9

希望睿智

簡介:軟件技術分享,一起學習,一起成長,一起進步