Rust 定義與實例化結構體

文章目錄

    • Rust 定義與實例化結構體
      • 5.1 結構體的定義與意義
      • 5.2 結構體實例化
        • 5.2.1 基本實例化
        • 5.2.2 可變性規則
        • 5.2.3 字段初始化簡寫
        • 5.2.4 結構體更新語法
      • 5.3 特殊結構體類型
        • 5.3.1 元組結構體(Tuple Struct)
        • 5.3.2 類單元結構體(Unit-Like Struct)
      • 5.4 結構體的所有權與生命周期
        • 5.4.1 所有權規則
        • 5.4.2 引用字段與生命周期
      • 5.5 最佳實踐與常見場景
      • 5.6 應用示例

Rust 定義與實例化結構體

Rust 結構體

結構體(struct)是Rust中組織和封裝相關數據的核心工具。它通過命名字段將不同類型的數據組合成一個有意義的整體,提供比元組更清晰的語義和更強的類型安全性。本章將深入探討結構體的定義、實例化及高級技巧。


5.1 結構體的定義與意義

結構體使用 struct 關鍵字定義,包含字段名和類型聲明:

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

核心特點

  1. 語義明確性:字段名(如 username)直接描述數據含義,避免了元組依賴位置索引的歧義性。
  2. 類型安全:每個字段類型在編譯時確定,確保內存安全。
  3. 靈活性:實例化時字段順序無需與定義一致。

與元組的對比

特性結構體元組
字段訪問點運算符(user.email索引(user.1
可讀性高(命名字段)低(依賴位置)
類型組合支持異構類型支持異構類型

5.2 結構體實例化

5.2.1 基本實例化

通過鍵值對為字段賦值:

let user1 = User {  email: String::from("alice@example.com"),  username: String::from("alice92"),  active: true,  sign_in_count: 1,  
};  
5.2.2 可變性規則
  • 整體可變:使用 mut 聲明整個實例可變,所有字段均可修改:
    let mut user1 = User { /* ... */ };  
    user1.email = String::from("new_email@example.com"); // 合法修改  
    
  • 禁止部分可變:Rust不支持單獨標記某個字段可變(如 mut username)。
5.2.3 字段初始化簡寫

當變量名與字段名相同時,可省略重復賦值:

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

此語法減少冗余代碼,提升可讀性。

5.2.4 結構體更新語法

使用 .. 從現有實例復制未顯式賦值的字段:

let user2 = User {  email: String::from("bob@example.com"),  ..user1 // 復制user1的其余字段  
};  

注意事項

  1. ..user1 必須置于末尾。
  2. 所有權轉移:若復制的字段包含所有權類型(如 String),原實例的對應字段將失效:
    println!("{}", user1.username); // ? 錯誤!所有權已轉移至user2  
    println!("{}", user1.active);   // ? 安全(bool實現Copy)  
    

5.3 特殊結構體類型

5.3.1 元組結構體(Tuple Struct)

定義時僅聲明字段類型,無字段名:

struct Color(i32, i32, i32);  
struct Point(i32, i32, i32);  let black = Color(0, 0, 0);  
let origin = Point(0, 0, 0);  

特點

  • 類型區分ColorPoint 是不同類型,即使字段類型相同。
  • 訪問方式:通過索引(如 black.0)或解構(let Color(r, g, b) = black;)訪問字段。
5.3.2 類單元結構體(Unit-Like Struct)

無任何字段的結構體:

struct AlwaysEqual;  
let subject = AlwaysEqual;  

應用場景

  • 實現 trait 但無需存儲數據(如標記類型)。
  • 泛型編程中的占位符。

5.4 結構體的所有權與生命周期

5.4.1 所有權規則

結構體默認擁有所有字段的所有權:

struct User {  username: String, // 擁有數據所有權  email: String,  // ...  
}  

優勢:結構體失效時自動釋放所有字段,避免內存泄漏。

5.4.2 引用字段與生命周期

若需在結構體中存儲引用,必須使用生命周期注解:

struct UserBorrowed<'a> {  username: &'a str, // 引用外部數據  email: &'a str,  
}  

要求:引用的數據(如 String 變量)必須比結構體實例存活更久,否則導致懸垂引用。


5.5 最佳實踐與常見場景

  1. 數據封裝:將關聯數據(如用戶信息)組合為結構體,提升代碼可讀性。
  2. 類型安全抽象:用獨立結構體區分語義不同的數據類型(如 UserId(u64)OrderId(u64))。
  3. 構建模式:通過構造函數(如 User::new())封裝實例化邏輯。

下一章將涵蓋結構體方法(impl 塊)和關聯函數,進一步擴展結構體的行為建模能力。

5.6 應用示例

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

demo


代碼示例均通過 Rust 1.78 編譯測試。深入實踐可參考 The Rust Book 。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87144.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ELK日志分析系統(filebeat+logstash+elasticsearch+kibana)

一、ELK 平臺介紹 1、ELK 概述 日志主要包括系統日志、應用程序日志和安全日志。系統運維和開發人員可以通過日志了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日志可以了解服務器的負荷&#xff0c;性能安全性&#xff0c;從而及時采取措施糾正錯誤。…

JS基礎4—jQuery

jQuery常用內容 jQuery 介紹jQuery 獲取方式基本選擇器 (最常用)層級選擇器 (基于元素間關系)過濾選擇器 (基于特定條件) jQuery事件綁定jQuery 方法調用jQuery遍歷jQuery 獲取與設置jQuery 添加與刪除jQuery CSS 類jQuery - AJAX 總結 jQuery 介紹 jQuery 是一個輕量級、快速…

時鐘周期是什么?

時鐘周期&#xff08;Clock Cycle&#xff09;是什么&#xff1f; 時鐘周期&#xff08;Clock Cycle&#xff09;是計算機系統中一個最基礎的時間單位&#xff0c;也稱為時鐘節拍或時鐘周期時間&#xff08;Clock Period&#xff09;。它由系統時鐘發生器產生的一個周期性脈沖…

如何用SEO優化長尾關鍵詞?

內容概要 在SEO優化領域&#xff0c;長尾關鍵詞扮演著至關重要的角色&#xff0c;它們能有效提升網站在搜索引擎中的可見度和流量轉化率。本文將全面解析如何通過系統方法優化長尾關鍵詞&#xff0c;涵蓋從基礎理論到實戰應用的完整流程。核心內容包括利用專業工具進行關鍵詞挖…

電子面單系統開發全解析

一、如果要做電子面單系統&#xff0c;怎么做&#xff1f; 開發電子面單系統是一項復雜且涉及多方面考量的工程&#xff0c;涵蓋需求分析、系統架構設計、技術選型、接口對接、安全性保障、第三方服務選擇以及部署與維護等關鍵環節。 電子面單系統開發步驟 需求分析&#xf…

UE5 - 制作《塞爾達傳說》中林克的技能 - 18 - 磁力抓取器

讓我們繼續《塞爾達傳說》中林克技能的制作!!! UE版本:5.6.0 VS版本:2022 本章節的核心目標:磁力抓取器 先讓我們看一下完成后的效果: 18_磁力抓取器 大綱如下: 引言功能架構與核心邏輯物理材質與場景配置代碼實現:從識別到操控操作說明1.引言 在《塞爾達傳說》中,林…

基于ApachePOI實現百度POI分類快速導入PostgreSQL數據庫實戰

目錄 前言 一、百度POI分類簡介 1、數據表格 2、分類結構 二、從Excel導入到PG數據庫 1、Excel解析流程 2、數據入庫 3、入庫成果及檢索 三、總結 前言 在上一篇博文中&#xff0c;我們對高德POI分類進行了深入剖析 并對Excel 中 POI 分類數據的存儲結構特點進行了詳細介…

學習經驗分享【41】YOLOv13:基于超圖增強自適應視覺感知的實時目標檢測

YOLO算法更新速度很快&#xff0c;已經出到V13版本&#xff0c;后續大家有想發論文或者搞項目可更新自己的baseline了。 摘要&#xff1a;YOLO 系列模型憑借其卓越的精度和計算效率&#xff0c;在實時目標檢測領域占據主導地位。然而&#xff0c;YOLOv11 及早期版本的卷積架構&…

Handling outliers in non-blind image deconvolution論文閱讀

Handling outliers in non-blind image deconvolution 1. 研究目標與實際意義2. 創新方法:基于EM的異常值建模2.1 新模糊模型2.1.1 目標函數2.2 EM框架:迭代優化二元掩碼2.2.1 E步:計算后驗權重 E [ m x ] E[m_x] E[mx?]2.2.2 M步:加權正則化反卷積2.3 優化加速技術2.3.1…

Redis 功能擴展:Lua 腳本對 Redis 的擴展

Redis 是一個高性能的內存數據庫&#xff0c;支持多種數據結構&#xff0c;如字符串、哈希、列表、集合和有序集合。為了增強其功能&#xff0c;Redis 引入了 Lua 腳本支持&#xff0c;使開發者可以編寫自定義的腳本&#xff0c;確保操作的原子性并提高復雜操作的性能。本文將詳…

七天學完十大機器學習經典算法-06.支持向量機(SVM):分類邊界的藝術——深入淺出指南

接上一篇《七天學完十大機器學習經典算法-05.從投票到分類&#xff1a;K近鄰(KNN)算法完全指南》 想象你要在操場上為兩個班級劃活動區域&#xff0c;如何畫出一條最公平的分界線&#xff1f;這條線不僅要分開兩班學生&#xff0c;還要讓兩個班都離分界線盡可能遠——這就是支持…

python如何安裝PyQt6-stubs依賴包

PyQt6-stubs 是為 PyQt6 提供類型提示&#xff08;Type Hints&#xff09;和 IDE 智能補全支持的第三方補丁包&#xff0c;特別適用于 PyCharm、VS Code 等現代 IDE。它對開發者在編碼時幫助極大。 一、安裝方法 需要提前安裝好git&#xff0c;然后克隆PyQt6-stubs源碼&#xf…

創宇智腦 MCP 賦能 AiPy,IP 風險調查效率實現 10 倍飛躍,威脅分析一鍵生成

還記得上個月那個焦頭爛額的凌晨三點嗎&#xff1f;監控大屏突然瘋狂閃爍&#xff0c;500 多個 IP 地址同時出現異常訪問&#xff0c;密密麻麻的數據流在屏幕上跳動&#xff0c;像極了一張讓人窒息的大網。我和團隊成員瞪著布滿血絲的眼睛&#xff0c;手動排查每一個 IP&#x…

使用SRS+ffmpeg實現https推流flv

1修改SRS的live.conf配置如下&#xff1a; # Live streaming config for SRS. # see full.conf for detail config.listen 1935; max_connections 1000; srs_log_tank console; daemon off;http_api {enabled on;listen …

力扣網編程題:合并兩個有序數組(雙指針解法)

一. 簡介 上一篇文章對"合并兩個有序數組"題目&#xff0c;使用了暴力解法&#xff0c;算法時間復雜度比較高。文章如下&#xff1a; 力扣網編程題&#xff1a;合并兩個有序數組&#xff08;直接解法&#xff09;-CSDN博客 本文滿足進階要求&#xff0c;算法時間復…

數據結構之 【樹的簡介】(樹的(相關)概念、二叉樹的概念、部分性質、滿二叉樹、完全二叉樹)

目錄 1.樹的概念及結構 1.1樹的概念 1.2樹的相關概念 1.3樹的表示 1.4樹在實際中的應用 2.二叉樹概念及結構 2.1二叉樹的概念 2.2特殊的二叉樹 2.3二叉樹的性質 2.4應用題 1.樹的概念及結構 1.1樹的概念 樹是一種非線性的數據結構&#xff0c;由 n&#xff08;n…

Redis-7.4.3-Windows-x64下載安裝使用

Redis軟件包下載地址鏈接&#xff1a;https://github.com/redis-windows/redis-windows/releases 檢查或者修改配置文件redis.conf&#xff1a; #如果允許外部其他主機訪問本機redis&#xff0c;設置成&#xff1a;bind 0.0.0.0 bind 127.0.0.1 protected-mode yes #設置端口…

Educational Codeforces Round 180 (Rated for Div. 2)

AB 略 C 對于axayaz>max(2*az,an)&#xff0c;枚舉y z 二分x D 首先&#xff0c;長度為1的邊的已經有n-1條&#xff0c;那么構造的圖中只能存在一條長度為2的好邊。我們先構造出一個圖只存在n-1條好邊&#xff0c;我們發現對于一個點所有連接它的邊要不均指向它要不均背…

CAD文件處理控件Aspose.CAD教程:在 Python 中將 DGN 文件轉換為 PDF

概述 將DGN文件轉換為PDF對許多行業至關重要&#xff0c;包括工程和建筑行業。能夠輕松地以 PDF 格式共享設計&#xff0c;增強協作和可訪問性。通過使用Aspose.CAD for Python via .NET的強大功能&#xff0c;開發人員可以高效地自動化此過程。這款 CAD 轉換器 SDK 簡化了轉換…

寧德時代攜手問界,以“廠中廠”模式加速擴產

6月30日&#xff0c;寧德時代在賽力斯超級工廠的兩條CTP2.0高端電池包產線正式投產。這是寧德時代在重慶布局的首個基地&#xff0c;并首次采用“廠中廠”合作模式&#xff0c;為問界系列車型本地化生產供應動力電池系統。重慶市、四川省廣安市有關負責人&#xff0c;賽力斯集團…