Rust Struct結構體詳解
Defining and Instanting 定義與實例化
使用struct
關鍵字以定義結構體。
struct User { id: u64, name: String, email: String, active: bool, }
使用let
語句聲明結構體的實例,使用mut
指定可變性(必須全部可變或不可變,沒有部分可變)
let user1 = User { id: 1u64, name: String::from("Zheng"), email: String::from("888888@outlook.com"), active: true, };
使用.
指定結構體成員,如user1.name
如果參數(shù)或變量與字段名同名,可以使用簡化寫法初始化變量
fn new_user(id: u64, name: String, email: String) -> User { User { id, name, email, active: true } }
使用結構體更新語法,可以基于已有實例的字段創(chuàng)建新實例
let user3 = User { id: 3u64, ..user2 };
使用..[instant_name]
語法,剩余字段將使用user2
的字段
Attention: 結構體更新等同于變量賦值,將發(fā)生value move,源變量可能導致不可用
let user3 = User { id: 3u64, ..user2 }; println!("{:#?}", user3); println!("user2: {:p}; user3: {:p}", &user2, &user3);
以上代碼將會產生錯誤:borrow of a partially moved value
。這是由于user2
的部分變量(字符串String)被賦值給了user3
,導致所有權發(fā)生轉移,結構體整體(不包括未發(fā)生value move的字段)將不再可用。
使用元組結構體可定義匿名字段
struct Color(i32, i32, i32); struct Point(i32, i32, i32);
注意,不同名的相同結構元組結構體將視為不同的類型,無法相互轉換
使用空結構體,只實現(xiàn)trait,不需要存儲任何數(shù)據(jù)時可以使用。
結構體數(shù)據(jù)的所有權:當一個結構體擁有其全部數(shù)據(jù)的所有權,則只要結構體有效,其數(shù)據(jù)就有效。如果存在對其他數(shù)據(jù)的引用,則需要使用生命周期支持。
Derived Traits派生trait
派生trait
,指通過derive
注解 derive attribute
來派生的trait
,可以為自定義類型添加許多功能。關于派生trait列表,詳見附錄C
這里使用Debug trait
展示自定義結構體的成員信息。
#[derive(Debug)] struct User { id: u64, name: String, email: String, active: bool, } fn main() { let user1 = User { id: 1u64, name: String::from("Zheng"), email: String::from("888888@outlook.com"), active: true, }; println!("{:#?}", user1); }
- 以上代碼會顯示
user1
的全部字段信息 - 也可以使用
{:?}
,單行輸出 - 實際上,它調用了
std::fmt::Display
,這被包含在派生trait中。
Method 方法
方法是定義在結構體(或枚舉類型enum
,trait
對象)的上下文中的類似函數(shù)的過程,第一個參數(shù)是self,用于指代調用方法的結構體實例。
Define
需要在impl
塊中定義方法,
#[derive(Debug)] struct Rectangle { width: u32, height: u32, } impl Rectangle { fn area(&self) -> u32 { self.width * self.height } } fn main() { let rect1 = Rectangle { width: 30, height: 20, }; println!("Size of {:?} is {}", rect1, rect1.area()); }
self
參數(shù)自動擁有impl
的結構體類型,不需要另行指定self
參數(shù)同樣擁有可變引用和直接獲取所有權- 除了方法必須在
impl
塊中,以及第一個參數(shù)名必須為self以外,其余與函數(shù)相同 - 可以使用多個
impl
塊來定義方法、關聯(lián)函數(shù),在泛型和trait中有應用價值
自動引用與解引用
在方法調用中,Rust支持自動引用與解引用,使調用者匹配方法的簽名,如添加& &mut *
等。
Associated function 關聯(lián)函數(shù)
之前已經提到過,還有不需要接收實例參數(shù)的關聯(lián)函數(shù)。因為其不做用于某個結構體實例,所以稱其為函數(shù)。使用::
來使用關聯(lián)函數(shù)。
到此這篇關于Rust Struct結構體詳解的文章就介紹到這了,更多相關Rust Struct內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vscode搭建rust開發(fā)環(huán)境的圖文教程
Rust 是一種系統(tǒng)編程語言,它專注于內存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,具有一定的參考價值,感興趣的可以了解一下2024-03-03在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析
在Rust中,Struct和Enum是組織數(shù)據(jù)的核心工具,Struct用于將相關字段封裝為單一實體,便于管理和擴展,Enum用于明確定義所有可能的狀態(tài),本文將通過具體示例,深入探討為什么在Rust中必須使用struct和enum來管理數(shù)據(jù),感興趣的朋友一起學習吧2025-02-02Rust 中的 Packages 與 Crates模塊化構建的基礎及開發(fā)流程
Rust中的Crate是編譯器處理的最小代碼單元,可以是二進制或庫,每個Crate由一個CrateRoot文件(通常是src/main.rs或src/lib.rs)定義,本文給大家介紹Rust 中的 Packages 與 Crates模塊化構建的基礎及開發(fā)流程,感興趣的朋友一起看看吧2025-02-02