自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Rust結(jié)構(gòu)體的定義和實例化

開發(fā)
Rust的結(jié)構(gòu)體跟元組類型比較類似,它們都包含多個相關(guān)的值。定義結(jié)構(gòu)體,需要使用 struct 關(guān)鍵字并為整個結(jié)構(gòu)體提供一個名字。

結(jié)構(gòu)體特點

Rust的結(jié)構(gòu)體跟元組類型比較類似,它們都包含多個相關(guān)的值。和元組一樣,結(jié)構(gòu)體的每一部分可以是不同類型。但不同于元組,結(jié)構(gòu)體需要命名各部分數(shù)據(jù)以便能清楚的表明其值的意義。由于有了這些名字,結(jié)構(gòu)體比元組更靈活:不需要依賴順序來指定或訪問實例中的值。

定義結(jié)構(gòu)體,需要使用 struct 關(guān)鍵字并為整個結(jié)構(gòu)體提供一個名字。結(jié)構(gòu)體的名字需要描述它所組合的數(shù)據(jù)的意義。接著,在大括號中,定義每一部分數(shù)據(jù)的名字和類型,一般稱為 字段(field)。

結(jié)構(gòu)體定義和實例化

下面是一個結(jié)構(gòu)體定義的示例:

struct User {
    active: bool,
    username: String,
    email: String,
    sign_in_count: u64,
}

一旦定義了結(jié)構(gòu)體后,為了使用它,通過為每個字段指定具體值來創(chuàng)建這個結(jié)構(gòu)體的 實例。創(chuàng)建一個實例需要以結(jié)構(gòu)體的名字開頭,接著在大括號中使用 key: value 鍵 - 值對的形式提供字段,其中 key 是字段的名字,value 是需要存儲在字段中的數(shù)據(jù)值。實例中字段的順序不需要和它們在結(jié)構(gòu)體中聲明的順序一致。換句話說,結(jié)構(gòu)體的定義就像一個類型的通用模板,而實例則會在這個模板中放入特定數(shù)據(jù)來創(chuàng)建這個類型的值。

下面是一個結(jié)構(gòu)體的應(yīng)用示例:

fn main() {
    let mut user1 = User {
        active: true,
        username: String::from("suntiger"),
        email: String::from("suntiger@example.com"),
        sign_in_count: 1,
    };

    user1.email = String::from("anotheremail@example.com");
}

整體代碼如下:

將代碼進行編譯, 可以發(fā)現(xiàn)email的內(nèi)容被替換了,如圖:

注意看接收結(jié)構(gòu)體實例的user1變量, 前面有mut關(guān)鍵字, 這樣方便我們修改結(jié)構(gòu)體成員, 注意整個結(jié)構(gòu)體實例必須是可變的, Rust不允許只將結(jié)構(gòu)體的某個字段標記為可變。

在函數(shù)中使用結(jié)構(gòu)體

先來看一段在函數(shù)中返回結(jié)構(gòu)體實例的代碼:

fn build_user(email: String, username: String) -> User {
    User {
        active: true,
        username: username,
        email: email,
        sign_in_count: 1,
    }
}

我們定義了一個build_user 函數(shù),它返回一個帶有給定的 email 和用戶名的 User 結(jié)構(gòu)體實例。active 字段的值為 true,并且 sign_in_count 的值為 1。需要注意同其他任何表達式一樣,我們可以在函數(shù)體的最后一個表達式中構(gòu)造一個結(jié)構(gòu)體的新實例,來隱式地返回這個實例。

字段初始化簡化方式

為函數(shù)參數(shù)起與結(jié)構(gòu)體字段相同的名字是可以理解的,但是不得不重復(fù) email 和 username 字段名稱與變量會讓人感到厭煩。如果結(jié)構(gòu)體有更多字段,重復(fù)每個名稱就更使人抓狂。還好Rust準備了簡化的方法。

先看下面的代碼:

fn build_user(email: String, username: String) -> User {
    User {
        active: true,
        username,
        email,
        sign_in_count: 1,
    }
}

參數(shù)名與字段名都完全相同,我們可以使用 字段初始化簡寫語法來重寫 build_user,這樣其行為與之前完全相同,無需在字段后面跟上相同名稱的字段內(nèi)容。

結(jié)構(gòu)體更新語法

使用舊實例的大部分值但改變其部分值來創(chuàng)建一個新的結(jié)構(gòu)體實例通常是很有用的。這可以通過結(jié)構(gòu)體更新語法實現(xiàn)。

看下面的應(yīng)用代碼:

fn main() {
    let user2 = User {
        active: user1.active,
        username: user1.username,
        email: String::from("another@example.com"),
        sign_in_count: user1.sign_in_count,
    };
}

使用結(jié)構(gòu)體更新語法,我們可以通過更少的代碼來達到相同的效果,看下面的代碼:

fn main() {

    let user2 = User {
        email: String::from("another@example.com"),
        ..user1
    };
}

.. 語法指定了剩余未顯式設(shè)置值的字段應(yīng)有與給定實例對應(yīng)字段相同的值。與此同時這段代碼也在 user2 中創(chuàng)建了一個新實例,但該實例中 email 字段的值與 user1 不同,而 username、 active 和 sign_in_count 字段的值與 user1 相同。..user1 必須放在最后,以指定其余的字段應(yīng)從 user1 的相應(yīng)字段中獲取其值,但我們可以選擇以任何順序為任意字段指定值,而不用考慮結(jié)構(gòu)體定義中字段的順序。

元組結(jié)構(gòu)體

也可以定義與元組類似的結(jié)構(gòu)體,稱為 元組結(jié)構(gòu)體。元組結(jié)構(gòu)體有著結(jié)構(gòu)體名稱提供的含義,但沒有具體的字段名,只有字段的類型。當(dāng)你想給整個元組取一個名字,并使元組成為與其他元組不同的類型時,元組結(jié)構(gòu)體是很有用的,這時像常規(guī)結(jié)構(gòu)體那樣為每個字段命名就顯得多余和形式化了。

要定義元組結(jié)構(gòu)體,以 struct 關(guān)鍵字和結(jié)構(gòu)體名開頭并后跟元組中的類型??聪旅孢@段代碼:

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);
}

注意 black 和 origin 值的類型不同,因為它們是不同的元組結(jié)構(gòu)體的實例。我們定義的每一個結(jié)構(gòu)體有其自己的類型,即使結(jié)構(gòu)體中的字段可能有著相同的類型。例如,一個獲取 Color 類型參數(shù)的函數(shù)不能接受 Point 作為參數(shù),即便這兩個類型都由三個 i32 值組成。在其他方面,元組結(jié)構(gòu)體實例類似于元組,你可以將它們解構(gòu)為單獨的部分,也可以使用 . 后跟索引來訪問單獨的值,等等。

類單元結(jié)構(gòu)體

我們也可以定義一個沒有任何字段的結(jié)構(gòu)體!它們被稱為 類單元結(jié)構(gòu)體, 因為它們類似于unit 類型。類單元結(jié)構(gòu)體常常在你想要在某個類型上實現(xiàn) trait 但不需要在類型中存儲數(shù)據(jù)的時候發(fā)揮作用。

定義代碼如下:

struct AlwaysEqual;

fn main() {
    let subject = AlwaysEqual;
}

要定義 AlwaysEqual,同樣也使用 struct 關(guān)鍵字,然后后面跟想要的名稱,然后是一個分號。不需要花括號或圓括號!然后,我們可以以類似的方式在 subject 變量中獲得 AlwaysEqual 的實例:使用我們定義的名稱,不需要任何花括號或圓括號。想象一下,我們將實現(xiàn)這個類型的行為,即每個實例始終等于每一個其他類型的實例,也許是為了獲得一個已知的結(jié)果以便進行測試。我們不需要任何數(shù)據(jù)來實現(xiàn)這種行為。

責(zé)任編輯:趙寧寧 來源: 二進制空間安全
相關(guān)推薦

2009-08-13 14:56:46

C#的結(jié)構(gòu)體使用

2009-08-13 14:46:03

C#結(jié)構(gòu)體定義

2009-08-13 14:36:40

C#結(jié)構(gòu)體構(gòu)造函數(shù)

2009-08-13 15:41:50

C#結(jié)構(gòu)體指針

2011-04-11 13:00:08

C++結(jié)構(gòu)體枚舉

2020-07-21 15:20:20

語言結(jié)構(gòu)體共用體

2018-10-12 11:11:39

Oracle內(nèi)存結(jié)構(gòu)

2009-08-13 14:06:37

C#結(jié)構(gòu)體結(jié)構(gòu)體和類的區(qū)別

2024-05-16 10:44:35

Go結(jié)構(gòu)體調(diào)用

2018-10-15 10:13:00

網(wǎng)絡(luò)拓撲結(jié)構(gòu)

2024-10-16 09:57:52

空結(jié)構(gòu)體map屬性

2022-09-18 23:09:13

Go語言標準庫

2022-01-07 08:24:13

STM32枚舉結(jié)構(gòu)體

2009-08-27 16:18:47

C#類C#結(jié)構(gòu)體

2014-04-01 10:11:33

C語言指針

2013-03-04 11:10:03

JavaJVM

2023-05-23 18:11:12

Rust數(shù)組元組

2011-07-20 14:45:43

C++結(jié)構(gòu)體

2023-07-29 15:03:29

2022-09-30 15:03:09

C語言深拷貝淺拷貝
點贊
收藏

51CTO技術(shù)棧公眾號