欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Rust Struct結構體詳解

 更新時間:2022年10月11日 14:25:53   作者:Zheng__Huang  
結構體,是一種自定義數(shù)據(jù)類型,允許程序員將不同類型的數(shù)據(jù)結合起來,形成相關聯(lián)的整體。Rust的結構體還提供方法和關聯(lián)函數(shù),可以指定那些與結構體數(shù)據(jù)相關的行為

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 方法

方法是定義在結構體(或枚舉類型enumtrait對象)的上下文中的類似函數(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 聊聊Rust 運算符

    聊聊Rust 運算符

    運算符 用于對數(shù)據(jù)執(zhí)行一些操作。被運算符執(zhí)行操作的數(shù)據(jù)我們稱之為操作數(shù)。下面通過本文給大家介紹Rust 運算符的相關知識,感興趣的朋友一起看看吧
    2021-11-11
  • vscode搭建rust開發(fā)環(huán)境的圖文教程

    vscode搭建rust開發(fā)環(huán)境的圖文教程

    Rust 是一種系統(tǒng)編程語言,它專注于內存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • rust 一個日志緩存記錄的通用實現(xiàn)方法

    rust 一個日志緩存記錄的通用實現(xiàn)方法

    本文給出了一個通用的設計模式,通過建造者模式實例化記錄對象,可自定義格式化器將實例化后的記錄對象寫入到指定的緩存對象中,這篇文章主要介紹了rust 一個日志緩存記錄的通用實現(xiàn)方法,需要的朋友可以參考下
    2024-04-04
  • rust?zip異步壓縮與解壓的代碼詳解

    rust?zip異步壓縮與解壓的代碼詳解

    在使用actix-web框架的時候,如果使用zip解壓任務將會占用一個工作線程,因為zip庫是同步阻塞的,想用異步非阻塞需要用另一個庫,下面介紹下rust?zip異步壓縮與解壓的示例,感興趣的朋友一起看看吧
    2024-04-04
  • 在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析

    在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析

    在Rust中,Struct和Enum是組織數(shù)據(jù)的核心工具,Struct用于將相關字段封裝為單一實體,便于管理和擴展,Enum用于明確定義所有可能的狀態(tài),本文將通過具體示例,深入探討為什么在Rust中必須使用struct和enum來管理數(shù)據(jù),感興趣的朋友一起學習吧
    2025-02-02
  • Rust生命周期常見誤區(qū)(中英對照)全面指南

    Rust生命周期常見誤區(qū)(中英對照)全面指南

    這篇文章主要WEIDJAI?介紹了Rust生命周期常見誤區(qū)(中英對照)的全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 一文學會Rust語言如何操作JSON

    一文學會Rust語言如何操作JSON

    JSON在Web開發(fā)中被廣泛應用于數(shù)據(jù)交換,本文主要介紹了Rust語言操作JSON,包括序列化、反序列化、JSON創(chuàng)建等多個方面,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Rust 中的 Packages 與 Crates模塊化構建的基礎及開發(fā)流程

    Rust 中的 Packages 與 Crates模塊化構建的基礎及開發(fā)流程

    Rust中的Crate是編譯器處理的最小代碼單元,可以是二進制或庫,每個Crate由一個CrateRoot文件(通常是src/main.rs或src/lib.rs)定義,本文給大家介紹Rust 中的 Packages 與 Crates模塊化構建的基礎及開發(fā)流程,感興趣的朋友一起看看吧
    2025-02-02
  • rust多個mod文件引用和文件夾mod使用注意事項小結

    rust多個mod文件引用和文件夾mod使用注意事項小結

    在 Rust 項目中,可以使用 mod 關鍵字將一個文件夾或一個 rs 文件作為一個模塊引入到當前文件中,本文給大家介紹rust多個mod文件引用和文件夾mod使用注意事項小結,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Rust?中?Deref?Coercion講解

    Rust?中?Deref?Coercion講解

    Rust 的設計理念一向是顯式比隱式好,也就是說所有的行為盡量在代碼中表現(xiàn)出來,這篇文章主要介紹了Rust?中?Deref?Coercion?介紹,需要的朋友可以參考下
    2022-10-10

最新評論