最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust結(jié)構(gòu)體的定義與實(shí)例化詳細(xì)講解

 更新時(shí)間:2022年12月12日 17:10:29   作者:共飲一杯無  
結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,它允許我們將多個(gè)不同的類型組合成一個(gè)整體。下面我們就來學(xué)習(xí)如何定義和使用結(jié)構(gòu)體,并對(duì)比元組與結(jié)構(gòu)體之間的異同,需要的可以參考一下

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

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

一個(gè)存儲(chǔ)用戶賬號(hào)信息的結(jié)構(gòu)體:

struct User {
    active: bool,
    username: String,
    email: String,
    sign_in_count: u64,
}
fn main() {}

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

聲明一個(gè)特定的用戶:

struct User {
    active: bool,
    username: String,
    email: String,
    sign_in_count: u64,
}
fn main() {
    let user1 = User {
        email: String::from("someone@example.com"),
        username: String::from("someusername123"),
        active: true,
        sign_in_count: 1,
    };
}

為了從結(jié)構(gòu)體中獲取某個(gè)特定的值,可以使用點(diǎn)號(hào)。舉個(gè)例子,想要用戶的郵箱地址,可以用 user1.email。如果結(jié)構(gòu)體的實(shí)例是可變的,我們可以使用點(diǎn)號(hào)并為對(duì)應(yīng)的字段賦值。

改變一個(gè)可變的 User 實(shí)例中 email 字段的值:

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

注意整個(gè)實(shí)例必須是可變的;Rust 并不允許只將某個(gè)字段標(biāo)記為可變。另外需要注意同其他任何表達(dá)式一樣,我們可以在函數(shù)體的最后一個(gè)表達(dá)式中構(gòu)造一個(gè)結(jié)構(gòu)體的新實(shí)例,來隱式地返回這個(gè)實(shí)例。

構(gòu)建一個(gè) build_user 函數(shù),它返回一個(gè)帶有給定的 email 和用戶名的 User 結(jié)構(gòu)體實(shí)例。active 字段的值為 true,并且 sign_in_count 的值為 1。

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

使用字段初始化簡(jiǎn)寫語法

我們可以使用 字段初始化簡(jiǎn)寫語法(field init shorthand)來重寫 build_user,這樣其行為與之前完全相同,不過無需重復(fù) email 和 username 了,如下:

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

build_user 函數(shù)使用了字段初始化簡(jiǎn)寫語法,因?yàn)?email 和 username 參數(shù)與結(jié)構(gòu)體字段同名

這里我們創(chuàng)建了一個(gè)新的 User 結(jié)構(gòu)體實(shí)例,它有一個(gè)叫做 email 的字段。我們想要將 email 字段的值設(shè)置為 build_user 函數(shù) email 參數(shù)的值。因?yàn)?email 字段與 email 參數(shù)有著相同的名稱,則只需編寫 email 而不是 email: email。

使用結(jié)構(gòu)體更新語法從其他實(shí)例創(chuàng)建實(shí)例

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

不使用更新語法時(shí),如何在 user2 中創(chuàng)建一個(gè)新 User 實(shí)例。我們?yōu)?email 設(shè)置了新的值,其他值則使用創(chuàng)建的 user1 中的同名值:

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

使用 user1 中的一個(gè)值創(chuàng)建一個(gè)新的 User 實(shí)例

使用結(jié)構(gòu)體更新語法,我們可以通過更少的代碼來達(dá)到相同的效果, 語法指定了剩余未顯式設(shè)置值的字段應(yīng)有與給定實(shí)例對(duì)應(yīng)字段相同的值。如下:

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

使用結(jié)構(gòu)體更新語法為一個(gè) User 實(shí)例設(shè)置一個(gè)新的 email 值,不過其余值來自 user1 變量中實(shí)例的字段

上述代碼也在 user2 中創(chuàng)建了一個(gè)新實(shí)例,但該實(shí)例中 email 字段的值與 user1 不同,而 username、 active 和 sign_in_count 字段的值與 user1 相同。…user1 必須放在最后,以指定其余的字段應(yīng)從 user1 的相應(yīng)字段中獲取其值,但我們可以選擇以任何順序?yàn)槿我庾侄沃付ㄖ?,而不用考慮結(jié)構(gòu)體定義中字段的順序。

請(qǐng)注意,結(jié)構(gòu)更新語法就像帶有 = 的賦值,因?yàn)樗苿?dòng)了數(shù)據(jù),就像我們?cè)?ldquo;變量與數(shù)據(jù)交互的方式(一):移動(dòng)”部分講到的一樣。在這個(gè)例子中,我們?cè)趧?chuàng)建 user2 后不能再使用 user1,因?yàn)?user1 的 username 字段中的 String 被移到 user2 中。如果我們給 user2 的 email 和 username 都賦予新的 String 值,從而只使用 user1 的 active 和 sign_in_count 值,那么 user1 在創(chuàng)建 user2 后仍然有效。active 和 sign_in_count 的類型是實(shí)現(xiàn) Copy trait 的類型,所以我們?cè)?ldquo;變量與數(shù)據(jù)交互的方式(二):克隆” 部分討論的行為同樣適用。

使用沒有命名字段的元組結(jié)構(gòu)體來創(chuàng)建不同的類型

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

要定義元組結(jié)構(gòu)體,以 struct 關(guān)鍵字和結(jié)構(gòu)體名開頭并后跟元組中的類型。例如,下面是兩個(gè)分別叫做 Color 和 Point 元組結(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 值的類型不同,因?yàn)樗鼈兪遣煌脑M結(jié)構(gòu)體的實(shí)例。你定義的每一個(gè)結(jié)構(gòu)體有其自己的類型,即使結(jié)構(gòu)體中的字段可能有著相同的類型。例如,一個(gè)獲取 Color 類型參數(shù)的函數(shù)不能接受 Point 作為參數(shù),即便這兩個(gè)類型都由三個(gè) i32 值組成。在其他方面,元組結(jié)構(gòu)體實(shí)例類似于元組,你可以將它們解構(gòu)為單獨(dú)的部分,也可以使用 . 后跟索引來訪問單獨(dú)的值,等等。

沒有任何字段的類單元結(jié)構(gòu)體

我們也可以定義一個(gè)沒有任何字段的結(jié)構(gòu)體!它們被稱為 類單元結(jié)構(gòu)體(unit-like structs)因?yàn)樗鼈冾愃朴?(),即“元組類型”一節(jié)中提到的 unit 類型。類單元結(jié)構(gòu)體常常在你想要在某個(gè)類型上實(shí)現(xiàn) trait 但不需要在類型中存儲(chǔ)數(shù)據(jù)的時(shí)候發(fā)揮作用。我們將在第十章介紹 trait。下面是一個(gè)聲明和實(shí)例化一個(gè)名為 AlwaysEqual 的 unit 結(jié)構(gòu)的例子。

struct AlwaysEqual;
fn main() {
    let subject = AlwaysEqual;
}

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

到此這篇關(guān)于Rust結(jié)構(gòu)體的定義與實(shí)例化詳細(xì)講解的文章就介紹到這了,更多相關(guān)Rust結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust中::和.的區(qū)別解析

    Rust中::和.的區(qū)別解析

    Rust中的::和.是兩種常用的操作符,分別用于訪問命名空間中的成員和實(shí)例的字段或方法,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Rust使用Channel實(shí)現(xiàn)跨線程傳遞數(shù)據(jù)

    Rust使用Channel實(shí)現(xiàn)跨線程傳遞數(shù)據(jù)

    消息傳遞是一種很流行且能保證安全并發(fā)的技術(shù),Rust也提供了一種基于消息傳遞的并發(fā)方式,在rust里使用標(biāo)準(zhǔn)庫提供的Channel來實(shí)現(xiàn),下面我們就來學(xué)習(xí)一下如何使用Channel實(shí)現(xiàn)跨線程傳遞數(shù)據(jù)吧
    2023-12-12
  • Rust 數(shù)據(jù)分析利器polars用法詳解

    Rust 數(shù)據(jù)分析利器polars用法詳解

    這篇文章主要介紹了Rust 數(shù)據(jù)分析利器polars用法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-08-08
  • Rust并發(fā)之異步編程應(yīng)用教程

    Rust并發(fā)之異步編程應(yīng)用教程

    這篇文章主要介紹了Rust并發(fā)之異步編程應(yīng)用教程,Rust的異步編程是一種強(qiáng)大的并發(fā)編程范式,它允許我們編寫高效、響應(yīng)迅速的應(yīng)用程序,通過掌握異步編程的高級(jí)應(yīng)用,我們可以充分利用系統(tǒng)資源,提高應(yīng)用程序的性能,需要的朋友可以參考下
    2026-05-05
  • 詳解Rust中#[derive]屬性怎么使用

    詳解Rust中#[derive]屬性怎么使用

    在 Rust 中,#[derive] 是一個(gè)屬性,用于自動(dòng)為類型生成常見的實(shí)現(xiàn),下面就跟隨小編一起來學(xué)習(xí)一下Rust中derive屬性的具體使用吧
    2024-11-11
  • 解析Rust?struct?中的生命周期

    解析Rust?struct?中的生命周期

    rust?的生命周期保證了內(nèi)存的安全性,同時(shí)也增加了開發(fā)者的心智負(fù)擔(dān)。是在上線之前多費(fèi)心思寫代碼,還是在上線以后忙忙活活查問題,這是個(gè)?trade?off?問題,這篇文章主要介紹了Rust?struct?中的生命周期,需要的朋友可以參考下
    2022-10-10
  • 使用systemd部署r-nacos的操作方法

    使用systemd部署r-nacos的操作方法

    r-nacos是一個(gè)用rust實(shí)現(xiàn)的nacos服務(wù),我們用它平替java?nacos以降低服務(wù)占用內(nèi)存,提升服務(wù)的穩(wěn)定性,這篇文章主要介紹了使用systemd部署r-nacos,需要的朋友可以參考下
    2024-03-03
  • 使用環(huán)境變量實(shí)現(xiàn)Rust程序中的不區(qū)分大小寫搜索方式

    使用環(huán)境變量實(shí)現(xiàn)Rust程序中的不區(qū)分大小寫搜索方式

    本文介紹了如何在Rust中實(shí)現(xiàn)不區(qū)分大小寫的搜索功能,并通過測(cè)試驅(qū)動(dòng)開發(fā)(TDD)方法逐步實(shí)現(xiàn)該功能,通過修改運(yùn)行函數(shù)和獲取環(huán)境變量,程序可以根據(jù)環(huán)境變量控制搜索模式
    2025-02-02
  • Rust?連接?PostgreSQL?數(shù)據(jù)庫的詳細(xì)過程

    Rust?連接?PostgreSQL?數(shù)據(jù)庫的詳細(xì)過程

    這篇文章主要介紹了Rust?連接?PostgreSQL?數(shù)據(jù)庫的完整代碼,本文圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Rust中vector的詳細(xì)用法

    Rust中vector的詳細(xì)用法

    Rust和C++同樣也有vector概念,本文主要介紹了Rust中vector的詳細(xì)用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03

最新評(píng)論

德令哈市| 张家界市| 临武县| 建阳市| 乌拉特中旗| 平顶山市| 晋中市| 唐山市| 明水县| 鄯善县| 柳江县| 安义县| 宣威市| 舞阳县| 会东县| 白朗县| 内江市| 独山县| 临夏市| 灵川县| 长岭县| 曲沃县| 临夏县| 建德市| 北安市| 湖南省| 临邑县| 绥化市| 寻甸| 淅川县| 鄯善县| 富锦市| 望奎县| 乐陵市| 静安区| 星子县| 谷城县| 泾源县| 茶陵县| 漠河县| 萝北县|