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

Rust Struct結(jié)構(gòu)體詳解

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

Defining and Instanting 定義與實例化

使用struct關(guān)鍵字以定義結(jié)構(gòu)體。

struct User {
	id: u64,
	name: String,
	email: String,
	active: bool,
}

使用let語句聲明結(jié)構(gòu)體的實例,使用mut指定可變性(必須全部可變或不可變,沒有部分可變)

let user1 = User {
    id: 1u64,
    name: String::from("Zheng"),
    email: String::from("888888@outlook.com"),
    active: true,
};

使用.指定結(jié)構(gòu)體成員,如user1.name

如果參數(shù)或變量與字段名同名,可以使用簡化寫法初始化變量

fn new_user(id: u64, name: String, email: String) -> User {
	User { 
		id, 
		name, 
		email, 
		active: true 
	}
}

使用結(jié)構(gòu)體更新語法,可以基于已有實例的字段創(chuàng)建新實例

	let user3 = User {
		id: 3u64,
		..user2
	};

使用..[instant_name]語法,剩余字段將使用user2的字段

Attention: 結(jié)構(gòu)體更新等同于變量賦值,將發(fā)生value move,源變量可能導(dǎo)致不可用

let user3 = User {
    id: 3u64,
    ..user2
};
println!("{:#?}", user3);
println!("user2: {:p}; user3: {:p}", &user2, &user3);

以上代碼將會產(chǎn)生錯誤:borrow of a partially moved value。這是由于user2的部分變量(字符串String)被賦值給了user3,導(dǎo)致所有權(quán)發(fā)生轉(zhuǎn)移,結(jié)構(gòu)體整體(不包括未發(fā)生value move的字段)將不再可用。

使用元組結(jié)構(gòu)體可定義匿名字段

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

注意,不同名的相同結(jié)構(gòu)元組結(jié)構(gòu)體將視為不同的類型,無法相互轉(zhuǎn)換

使用空結(jié)構(gòu)體,只實現(xiàn)trait,不需要存儲任何數(shù)據(jù)時可以使用。

結(jié)構(gòu)體數(shù)據(jù)的所有權(quán):當(dāng)一個結(jié)構(gòu)體擁有其全部數(shù)據(jù)的所有權(quán),則只要結(jié)構(gòu)體有效,其數(shù)據(jù)就有效。如果存在對其他數(shù)據(jù)的引用,則需要使用生命周期支持。

Derived Traits派生trait

派生trait,指通過derive注解 derive attribute來派生的trait,可以為自定義類型添加許多功能。關(guān)于派生trait列表,詳見附錄C

這里使用Debug trait展示自定義結(jié)構(gòu)體的成員信息。

#[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的全部字段信息
  • 也可以使用{:?},單行輸出
  • 實際上,它調(diào)用了std::fmt::Display,這被包含在派生trait中。

Method 方法

方法是定義在結(jié)構(gòu)體(或枚舉類型enum,trait對象)的上下文中的類似函數(shù)的過程,第一個參數(shù)是self,用于指代調(diào)用方法的結(jié)構(gòu)體實例。

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的結(jié)構(gòu)體類型,不需要另行指定
  • self參數(shù)同樣擁有可變引用和直接獲取所有權(quán)
  • 除了方法必須在impl塊中,以及第一個參數(shù)名必須為self以外,其余與函數(shù)相同
  • 可以使用多個impl塊來定義方法、關(guān)聯(lián)函數(shù),在泛型和trait中有應(yīng)用價值

自動引用與解引用

在方法調(diào)用中,Rust支持自動引用與解引用,使調(diào)用者匹配方法的簽名,如添加& &mut *等。

Associated function 關(guān)聯(lián)函數(shù)

之前已經(jīng)提到過,還有不需要接收實例參數(shù)的關(guān)聯(lián)函數(shù)。因為其不做用于某個結(jié)構(gòu)體實例,所以稱其為函數(shù)。使用::來使用關(guān)聯(lián)函數(shù)。

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

相關(guān)文章

  • Rust文件I/O操作多種場景應(yīng)用筆記

    Rust文件I/O操作多種場景應(yīng)用筆記

    這篇文章主要介紹了Rust文件I/O操作多種場景的應(yīng)用,Rust的文件I/O操作提供了豐富的功能,從基本的文件讀寫到高級的目錄操作、元數(shù)據(jù)獲取、臨時文件和異步I/O,通過掌握這些高級應(yīng)用,我們可以編寫更加高效、可靠的文件操作代碼,需要的朋友可以參考下
    2026-05-05
  • Rust?所有權(quán)機(jī)制原理深入剖析

    Rust?所有權(quán)機(jī)制原理深入剖析

    這篇文章主要為大家介紹了Rust?所有權(quán)機(jī)制原理深入剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Rust語言實現(xiàn)圖像編碼轉(zhuǎn)換

    Rust語言實現(xiàn)圖像編碼轉(zhuǎn)換

    image-rs庫是?Rust?社區(qū)中廣泛使用的一個開源庫,它提供了豐富的圖像編解碼功能,本文主要介紹了Rust語言實現(xiàn)圖像編碼轉(zhuǎn)換,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • 在Rust中編寫自定義Error的詳細(xì)代碼

    在Rust中編寫自定義Error的詳細(xì)代碼

    Result<T, E> 類型可以方便地用于錯誤傳導(dǎo),Result<T, E>是模板類型,實例化后可以是各種類型,但 Rust 要求傳導(dǎo)的 Result 中的 E 是相同類型的,所以我們需要編寫自己的 Error 類型,本文給大家介紹了在Rust中編寫自定義Error的詳細(xì)代碼,需要的朋友可以參考下
    2024-01-01
  • 最新評論

    镇赉县| 霍城县| 瓦房店市| 曲沃县| 南汇区| 西平县| 饶平县| 同仁县| 新巴尔虎左旗| 正安县| 东安县| 鲁山县| 隆安县| 永康市| 正镶白旗| 长治市| 尼勒克县| 专栏| 军事| 泸水县| 阳东县| 齐河县| 西丰县| 乌兰县| 鹿邑县| 交城县| 金乡县| 辽阳县| 纳雍县| 永嘉县| 澄城县| 南靖县| 湟中县| 赣榆县| 若尔盖县| 克什克腾旗| 钟祥市| 黑河市| 江永县| 鹤庆县| 滦平县|