詳解Rust中的方法
Rust中的方法
方法其實就是結(jié)構(gòu)體的成員函數(shù),在C語言中的結(jié)構(gòu)體是沒有成員函數(shù)的,但是Rust畢竟也是一門面向?qū)ο蟮木幊陶Z言,所以給結(jié)構(gòu)體加上方法的特性很符合面向?qū)ο蟮奶攸c。
方法的簡單概念
方法(method)與函數(shù)類似:它們使用 fn
關(guān)鍵字和名稱聲明,可以擁有參數(shù)和返回值,同時包含在某處調(diào)用該方法時會執(zhí)行的代碼。不過方法與函數(shù)是不同的,因為它們在結(jié)構(gòu)體的上下文中被定義,并且它們第一個參數(shù)總是 self
,它代表調(diào)用該方法的結(jié)構(gòu)體實例。
&self
實際上是self: &Self
的縮寫,在一個impl
塊中,Self
類型是impl
塊的類型的別名。方法的第一個參數(shù)必須有一個名為self
的Self
類型的參數(shù),所以 Rust 讓你在第一個參數(shù)位置上只用self
這個名字來縮寫。傳參的時候可以忽略self的傳參。
上面這段話是官方文檔對方法的描述。如果學(xué)過面向?qū)ο蟮膽?yīng)該理解起來是沒人任何問題的,方法就是類中的成員函數(shù),在調(diào)用方法是必須通過類的實例對象類調(diào)用。
使用方法代替函數(shù)的好處:
- 減少self參數(shù)的書寫
- 組織性好
定義方法
定義方法的方式和定義函數(shù)的方式類似,也是采用fn作為標(biāo)識,但是方法比函數(shù)多一點的就是需要被包含在impl中。
impl是implementation的簡寫,翻譯成中文就是實施,實現(xiàn)的意思。在Rust中所有的方法都必須在對應(yīng)的結(jié)構(gòu)體的impl中實現(xiàn),并且方法的第一個參數(shù)是&self,其中&self就是指向當(dāng)前對象的引用,類似于C++中的this、Java中的this、Python中的self.
基本結(jié)構(gòu):
impl 結(jié)構(gòu)體名 { 方法1... 方法2... .... 方法n... } //也可以再開一個impl impl 結(jié)構(gòu)體名 { 方法n+1.... } //其中以上的效果和下面寫法等效 impl 結(jié)構(gòu)體名 { 方法1... 方法2... .... 方法n... 方法n+1.... }
可以重開一個impl的特性就像C++中的namespace一樣,如果想了解namespace的可自行查詢資料。
綜上所述,impl的作用就是用來標(biāo)識哪些方法是屬于哪個結(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); } } /*上面兩個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自動引用和解引用
在C++中訪問對象的內(nèi)容,一般都是使用指針和指針運算符->
來訪問對象中的屬性(成員變量)和行為(成員函數(shù))。但是在Rust沒有和->
等效的運算符。Rust是存在了自動引用和解引用的功能。
當(dāng)使用對象來調(diào)用方法時,Rust會自動為對象添加&
、&mut
或*
以便對象與方法簽名匹配,即下面的代碼是等價的:
mm.show(); //這種方法比較簡潔 (&mm).show(); //這種方法稍微多了點東西
這種自動引用的行為之所以有效,是因為方法有一個明確的接收者———— self
的類型。在給出接收者和方法名的前提下,Rust 可以明確地計算出方法是僅僅讀?。?code>&self),做出修改(&mut self
)或者是獲取所有權(quán)(self
)。事實上,Rust 對方法接收者的隱式借用讓所有權(quán)在實踐中更友好。
//以下都是等效的,都可以修改age的值 mm.age = 19; (&mut mm).age = 89;
Rust 對方法接收者的隱式借用讓所有權(quán)在實踐中更友好。意思就是使用對象直接點操作就行了。
帶參數(shù)的方法
因為方法和函數(shù)是類似的,所以在方法中也是可以傳參的。
直接看一個例子就直接跳過了。
impl MM { //前面已經(jīng)聲明過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)體有意義的自定義類型。通過結(jié)構(gòu)體,我們可以將相關(guān)聯(lián)的數(shù)據(jù)片段聯(lián)系起來并命名它們,這樣可以使得代碼更加清晰。在 impl
塊中,你可以定義與你的類型相關(guān)聯(lián)的函數(shù),而方法是一種相關(guān)聯(lián)的函數(shù),讓你指定結(jié)構(gòu)體的實例所具有的行為。
但結(jié)構(gòu)體并不是創(chuàng)建自定義類型的唯一方法:讓我們轉(zhuǎn)向 Rust 的枚舉功能,為你的工具箱再添一個工具。
到此這篇關(guān)于Rust中的方法的文章就介紹到這了,更多相關(guān)Rust中的方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Rust中三種循環(huán)(loop,while,for)的使用
我們常常需要重復(fù)執(zhí)行同一段代碼,針對這種場景,Rust?提供了多種循環(huán)(loop)工具。一個循環(huán)會執(zhí)行循環(huán)體中的代碼直到結(jié)尾,并緊接著回到開頭繼續(xù)執(zhí)行。而?Rust?提供了?3?種循環(huán):loop、while?和?for,下面逐一講解2022-09-09Rust聲明宏在不同K線bar類型中的應(yīng)用小結(jié)
在K線bar中,往往有很多不同分時k線圖,比如1,2,3,5,,,,,60,120,250,300…,,不同分鐘類型,如果不用宏,那么手寫會比較麻煩,下面就試用一下宏來實現(xiàn)不同類型的bar,感興趣的朋友一起看看吧2024-05-05MacBook Pro安裝rust編程環(huán)境的過程
rustup是一個用于管理Rust版本和工具鏈的工具,這篇文章主要介紹了MacBook Pro安裝rust編程環(huán)境的過程,感興趣的朋友跟隨小編一起看看吧2024-02-02