詳解Rust中的方法
Rust中的方法
方法其實(shí)就是結(jié)構(gòu)體的成員函數(shù),在C語(yǔ)言中的結(jié)構(gòu)體是沒(méi)有成員函數(shù)的,但是Rust畢竟也是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言,所以給結(jié)構(gòu)體加上方法的特性很符合面向?qū)ο蟮奶攸c(diǎn)。
方法的簡(jiǎn)單概念
方法(method)與函數(shù)類(lèi)似:它們使用 fn 關(guān)鍵字和名稱(chēng)聲明,可以擁有參數(shù)和返回值,同時(shí)包含在某處調(diào)用該方法時(shí)會(huì)執(zhí)行的代碼。不過(guò)方法與函數(shù)是不同的,因?yàn)樗鼈冊(cè)诮Y(jié)構(gòu)體的上下文中被定義,并且它們第一個(gè)參數(shù)總是 self,它代表調(diào)用該方法的結(jié)構(gòu)體實(shí)例。
&self實(shí)際上是self: &Self的縮寫(xiě),在一個(gè)impl塊中,Self類(lèi)型是impl塊的類(lèi)型的別名。方法的第一個(gè)參數(shù)必須有一個(gè)名為self的Self類(lèi)型的參數(shù),所以 Rust 讓你在第一個(gè)參數(shù)位置上只用self這個(gè)名字來(lái)縮寫(xiě)。傳參的時(shí)候可以忽略self的傳參。
上面這段話(huà)是官方文檔對(duì)方法的描述。如果學(xué)過(guò)面向?qū)ο蟮膽?yīng)該理解起來(lái)是沒(méi)人任何問(wèn)題的,方法就是類(lèi)中的成員函數(shù),在調(diào)用方法是必須通過(guò)類(lèi)的實(shí)例對(duì)象類(lèi)調(diào)用。
使用方法代替函數(shù)的好處:
- 減少self參數(shù)的書(shū)寫(xiě)
- 組織性好
定義方法
定義方法的方式和定義函數(shù)的方式類(lèi)似,也是采用fn作為標(biāo)識(shí),但是方法比函數(shù)多一點(diǎn)的就是需要被包含在impl中。
impl是implementation的簡(jiǎn)寫(xiě),翻譯成中文就是實(shí)施,實(shí)現(xiàn)的意思。在Rust中所有的方法都必須在對(duì)應(yīng)的結(jié)構(gòu)體的impl中實(shí)現(xiàn),并且方法的第一個(gè)參數(shù)是&self,其中&self就是指向當(dāng)前對(duì)象的引用,類(lèi)似于C++中的this、Java中的this、Python中的self.
基本結(jié)構(gòu):
impl 結(jié)構(gòu)體名 {
方法1...
方法2...
....
方法n...
}
//也可以再開(kāi)一個(gè)impl
impl 結(jié)構(gòu)體名 {
方法n+1....
}
//其中以上的效果和下面寫(xiě)法等效
impl 結(jié)構(gòu)體名 {
方法1...
方法2...
....
方法n...
方法n+1....
}
可以重開(kāi)一個(gè)impl的特性就像C++中的namespace一樣,如果想了解namespace的可自行查詢(xún)資料。
綜上所述,impl的作用就是用來(lái)標(biāo)識(shí)哪些方法是屬于哪個(gè)結(jié)構(gòu)體的。
例子:
struct MM {
name: String,
age: u8,
}
impl MM {
fn get_name(&self) -> &str {
&self.name
}
fn get_age(&self) -> &u8 {
&self.age
}
}
impl MM {
fn show(&self) {
println!("name: {}", self.name);
println!("age: {}", self.age);
}
}
/*上面兩個(gè)impl等效于以下代碼
impl MM {
fn get_name(&self) -> &str {
&self.name
}
fn get_age(&self) -> &u8 {
&self.age
}
fn show(&self) {
println!("name: {}", self.name);
println!("age: {}", self.age);
}
}
*/
fn main() {
let mm = MM {
name: String::from("Alice"),
age: 18,
};
mm.show();
println!("{}的名字叫: {}, 她今年{}歲了", mm.name, mm.get_name(), mm.get_age());
}
結(jié)果:
name: Alice
age: 18
Alice的名字叫: Alice, 她今年18歲了
Rust自動(dòng)引用和解引用
在C++中訪(fǎng)問(wèn)對(duì)象的內(nèi)容,一般都是使用指針和指針運(yùn)算符->來(lái)訪(fǎng)問(wèn)對(duì)象中的屬性(成員變量)和行為(成員函數(shù))。但是在Rust沒(méi)有和->等效的運(yùn)算符。Rust是存在了自動(dòng)引用和解引用的功能。
當(dāng)使用對(duì)象來(lái)調(diào)用方法時(shí),Rust會(huì)自動(dòng)為對(duì)象添加&、&mut或*以便對(duì)象與方法簽名匹配,即下面的代碼是等價(jià)的:
mm.show(); //這種方法比較簡(jiǎn)潔 (&mm).show(); //這種方法稍微多了點(diǎn)東西
這種自動(dòng)引用的行為之所以有效,是因?yàn)榉椒ㄓ幸粋€(gè)明確的接收者———— self 的類(lèi)型。在給出接收者和方法名的前提下,Rust 可以明確地計(jì)算出方法是僅僅讀取(&self),做出修改(&mut self)或者是獲取所有權(quán)(self)。事實(shí)上,Rust 對(duì)方法接收者的隱式借用讓所有權(quán)在實(shí)踐中更友好。
//以下都是等效的,都可以修改age的值 mm.age = 19; (&mut mm).age = 89;
Rust 對(duì)方法接收者的隱式借用讓所有權(quán)在實(shí)踐中更友好。意思就是使用對(duì)象直接點(diǎn)操作就行了。
帶參數(shù)的方法
因?yàn)榉椒ê秃瘮?shù)是類(lèi)似的,所以在方法中也是可以傳參的。
直接看一個(gè)例子就直接跳過(guò)了。
impl MM { //前面已經(jīng)聲明過(guò)MM的結(jié)構(gòu)體了
fn eat(&self, food: &String) {
println!("{}想吃{}", self.name, food);
}
}
fn main() {
let mm = MM {
name: String::from("Alice"),
age: 18,
money: 100,
};
mm.eat(&"手撕雞".to_string());
}
結(jié)果:
Alice想吃手撕雞
小結(jié)
結(jié)構(gòu)體有意義的自定義類(lèi)型。通過(guò)結(jié)構(gòu)體,我們可以將相關(guān)聯(lián)的數(shù)據(jù)片段聯(lián)系起來(lái)并命名它們,這樣可以使得代碼更加清晰。在 impl 塊中,你可以定義與你的類(lèi)型相關(guān)聯(lián)的函數(shù),而方法是一種相關(guān)聯(lián)的函數(shù),讓你指定結(jié)構(gòu)體的實(shí)例所具有的行為。
但結(jié)構(gòu)體并不是創(chuàng)建自定義類(lèi)型的唯一方法:讓我們轉(zhuǎn)向 Rust 的枚舉功能,為你的工具箱再添一個(gè)工具。
到此這篇關(guān)于Rust中的方法的文章就介紹到這了,更多相關(guān)Rust中的方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust實(shí)現(xiàn)構(gòu)建器模式和如何使用Bon庫(kù)中的構(gòu)建器
這篇文章主要介紹了Rust實(shí)現(xiàn)構(gòu)建器模式和如何使用Bon庫(kù)中的構(gòu)建器,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08
Rust中字符串類(lèi)型String的46種常用方法分享
Rust主要有兩種類(lèi)型的字符串:&str和String,本文主要為大家介紹的是String類(lèi)型的字符串以及它常用的46種方法,感興趣的小伙伴可以了解一下2023-06-06
Rust 中的 Packages 與 Crates模塊化構(gòu)建的基礎(chǔ)及開(kāi)發(fā)流程
Rust中的Crate是編譯器處理的最小代碼單元,可以是二進(jìn)制或庫(kù),每個(gè)Crate由一個(gè)CrateRoot文件(通常是src/main.rs或src/lib.rs)定義,本文給大家介紹Rust 中的 Packages 與 Crates模塊化構(gòu)建的基礎(chǔ)及開(kāi)發(fā)流程,感興趣的朋友一起看看吧2025-02-02
Rust-使用dotenvy加載和使用環(huán)境變量的過(guò)程詳解
系統(tǒng)的開(kāi)發(fā),測(cè)試和部署離不開(kāi)環(huán)境變量,今天分享在Rust的系統(tǒng)開(kāi)發(fā)中,使用dotenvy來(lái)讀取和使用環(huán)境變量,感興趣的朋友跟隨小編一起看看吧2023-11-11
rust多個(gè)mod文件引用和文件夾mod使用注意事項(xiàng)小結(jié)
在 Rust 項(xiàng)目中,可以使用 mod 關(guān)鍵字將一個(gè)文件夾或一個(gè) rs 文件作為一個(gè)模塊引入到當(dāng)前文件中,本文給大家介紹rust多個(gè)mod文件引用和文件夾mod使用注意事項(xiàng)小結(jié),感興趣的朋友跟隨小編一起看看吧2024-03-03

