日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Rust結構體的定義和實例化

來源: 責編: 時間:2024-01-02 17:28:31 218觀看
導讀結構體特點Rust的結構體跟元組類型比較類似,它們都包含多個相關的值。和元組一樣,結構體的每一部分可以是不同類型。但不同于元組,結構體需要命名各部分數據以便能清楚的表明其值的意義。由于有了這些名字,結構體比元組

結構體特點

Rust的結構體跟元組類型比較類似,它們都包含多個相關的值。和元組一樣,結構體的每一部分可以是不同類型。但不同于元組,結構體需要命名各部分數據以便能清楚的表明其值的意義。由于有了這些名字,結構體比元組更靈活:不需要依賴順序來指定或訪問實例中的值。V6g28資訊網——每日最新資訊28at.com

定義結構體,需要使用 struct 關鍵字并為整個結構體提供一個名字。結構體的名字需要描述它所組合的數據的意義。接著,在大括號中,定義每一部分數據的名字和類型,一般稱為 字段(field)。V6g28資訊網——每日最新資訊28at.com

V6g28資訊網——每日最新資訊28at.com

結構體定義和實例化

下面是一個結構體定義的示例:V6g28資訊網——每日最新資訊28at.com

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

一旦定義了結構體后,為了使用它,通過為每個字段指定具體值來創建這個結構體的 實例。創建一個實例需要以結構體的名字開頭,接著在大括號中使用 key: value 鍵 - 值對的形式提供字段,其中 key 是字段的名字,value 是需要存儲在字段中的數據值。實例中字段的順序不需要和它們在結構體中聲明的順序一致。換句話說,結構體的定義就像一個類型的通用模板,而實例則會在這個模板中放入特定數據來創建這個類型的值。V6g28資訊網——每日最新資訊28at.com

下面是一個結構體的應用示例:V6g28資訊網——每日最新資訊28at.com

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");}

整體代碼如下:V6g28資訊網——每日最新資訊28at.com

V6g28資訊網——每日最新資訊28at.com

將代碼進行編譯, 可以發現email的內容被替換了,如圖:V6g28資訊網——每日最新資訊28at.com

V6g28資訊網——每日最新資訊28at.com

注意看接收結構體實例的user1變量, 前面有mut關鍵字, 這樣方便我們修改結構體成員, 注意整個結構體實例必須是可變的, Rust不允許只將結構體的某個字段標記為可變。V6g28資訊網——每日最新資訊28at.com

在函數中使用結構體

先來看一段在函數中返回結構體實例的代碼:V6g28資訊網——每日最新資訊28at.com

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

我們定義了一個build_user 函數,它返回一個帶有給定的 email 和用戶名的 User 結構體實例。active 字段的值為 true,并且 sign_in_count 的值為 1。需要注意同其他任何表達式一樣,我們可以在函數體的最后一個表達式中構造一個結構體的新實例,來隱式地返回這個實例。V6g28資訊網——每日最新資訊28at.com

字段初始化簡化方式

為函數參數起與結構體字段相同的名字是可以理解的,但是不得不重復 email 和 username 字段名稱與變量會讓人感到厭煩。如果結構體有更多字段,重復每個名稱就更使人抓狂。還好Rust準備了簡化的方法。V6g28資訊網——每日最新資訊28at.com

先看下面的代碼:V6g28資訊網——每日最新資訊28at.com

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

參數名與字段名都完全相同,我們可以使用 字段初始化簡寫語法來重寫 build_user,這樣其行為與之前完全相同,無需在字段后面跟上相同名稱的字段內容。V6g28資訊網——每日最新資訊28at.com

結構體更新語法

使用舊實例的大部分值但改變其部分值來創建一個新的結構體實例通常是很有用的。這可以通過結構體更新語法實現。V6g28資訊網——每日最新資訊28at.com

看下面的應用代碼:V6g28資訊網——每日最新資訊28at.com

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

使用結構體更新語法,我們可以通過更少的代碼來達到相同的效果,看下面的代碼:V6g28資訊網——每日最新資訊28at.com

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

.. 語法指定了剩余未顯式設置值的字段應有與給定實例對應字段相同的值。與此同時這段代碼也在 user2 中創建了一個新實例,但該實例中 email 字段的值與 user1 不同,而 username、 active 和 sign_in_count 字段的值與 user1 相同。..user1 必須放在最后,以指定其余的字段應從 user1 的相應字段中獲取其值,但我們可以選擇以任何順序為任意字段指定值,而不用考慮結構體定義中字段的順序。V6g28資訊網——每日最新資訊28at.com

元組結構體

也可以定義與元組類似的結構體,稱為 元組結構體。元組結構體有著結構體名稱提供的含義,但沒有具體的字段名,只有字段的類型。當你想給整個元組取一個名字,并使元組成為與其他元組不同的類型時,元組結構體是很有用的,這時像常規結構體那樣為每個字段命名就顯得多余和形式化了。V6g28資訊網——每日最新資訊28at.com

要定義元組結構體,以 struct 關鍵字和結構體名開頭并后跟元組中的類型。看下面這段代碼:V6g28資訊網——每日最新資訊28at.com

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 值的類型不同,因為它們是不同的元組結構體的實例。我們定義的每一個結構體有其自己的類型,即使結構體中的字段可能有著相同的類型。例如,一個獲取 Color 類型參數的函數不能接受 Point 作為參數,即便這兩個類型都由三個 i32 值組成。在其他方面,元組結構體實例類似于元組,你可以將它們解構為單獨的部分,也可以使用 . 后跟索引來訪問單獨的值,等等。V6g28資訊網——每日最新資訊28at.com

類單元結構體

我們也可以定義一個沒有任何字段的結構體!它們被稱為 類單元結構體, 因為它們類似于unit 類型。類單元結構體常常在你想要在某個類型上實現 trait 但不需要在類型中存儲數據的時候發揮作用。V6g28資訊網——每日最新資訊28at.com

定義代碼如下:V6g28資訊網——每日最新資訊28at.com

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

要定義 AlwaysEqual,同樣也使用 struct 關鍵字,然后后面跟想要的名稱,然后是一個分號。不需要花括號或圓括號!然后,我們可以以類似的方式在 subject 變量中獲得 AlwaysEqual 的實例:使用我們定義的名稱,不需要任何花括號或圓括號。想象一下,我們將實現這個類型的行為,即每個實例始終等于每一個其他類型的實例,也許是為了獲得一個已知的結果以便進行測試。我們不需要任何數據來實現這種行為。V6g28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-56424-0.htmlRust結構體的定義和實例化

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 多個線程為競爭資源而相互等待,導致程序無法繼續執行

下一篇: 在 Go 項目中封裝 AES 加解密客戶端接口

標簽:
  • 熱門焦點
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發布,本次就這款耳機新品給大家帶來一個簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • Python異步IO編程的進程/線程通信實現

    這篇文章再講3種方式,同時講4中進程間通信的方式一、 Python 中線程間通信的實現方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁“充值中心”入口上線了本機生活界面。壹覽商業發現,該界面目前主要
  • iQOO Neo8 Pro搶先上架:首發天璣9200+ 安卓性能之王

    經過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調校的作品。隨著發布時
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風扇版本

    據10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風扇版本。另外,這款顯卡 PCB
Top 主站蜘蛛池模板: 太仆寺旗| 厦门市| 盘锦市| 凌源市| 南阳市| 无为县| 平和县| 开鲁县| 格尔木市| 新乡市| 海盐县| 天气| 江西省| 三都| 永康市| 肥城市| 资溪县| 长丰县| 吴桥县| 隆安县| 陆丰市| 娄烦县| 海晏县| 女性| 嘉义县| 宝坻区| 东明县| 孟州市| 杭锦旗| 罗平县| 连州市| 灵丘县| 荥经县| 湘潭县| 固阳县| 涟水县| 五峰| 诸暨市| 万年县| 通城县| 克东县|