<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
方法其實就是結構體的成員函數,在C語言中的結構體是沒有成員函數的,但是Rust畢竟也是一門物件導向的程式語言,所以給結構體加上方法的特性很符合物件導向的特點。
方法(method)與函數類似:它們使用 fn
關鍵字和名稱宣告,可以擁有引數和返回值,同時包含在某處呼叫該方法時會執行的程式碼。不過方法與函數是不同的,因為它們在結構體的上下文中被定義,並且它們第一個引數總是 self
,它代表呼叫該方法的結構體範例。
&self
實際上是self: &Self
的縮寫,在一個impl
塊中,Self
型別是impl
塊的型別的別名。方法的第一個引數必須有一個名為self
的Self
型別的引數,所以 Rust 讓你在第一個引數位置上只用self
這個名字來縮寫。傳參的時候可以忽略self的傳參。
上面這段話是官方檔案對方法的描述。如果學過物件導向的應該理解起來是沒人任何問題的,方法就是類中的成員函數,在呼叫方法是必須通過類的範例物件類呼叫。
使用方法代替函數的好處:
定義方法的方式和定義函數的方式類似,也是採用fn作為標識,但是方法比函數多一點的就是需要被包含在impl中。
impl是implementation的簡寫,翻譯成中文就是實施,實現的意思。在Rust中所有的方法都必須在對應的結構體的impl中實現,並且方法的第一個引數是&self,其中&self就是指向當前物件的參照,類似於C++中的this、Java中的this、Python中的self.
基本結構:
impl 結構體名 { 方法1... 方法2... .... 方法n... } //也可以再開一個impl impl 結構體名 { 方法n+1.... } //其中以上的效果和下面寫法等效 impl 結構體名 { 方法1... 方法2... .... 方法n... 方法n+1.... }
可以重開一個impl的特性就像C++中的namespace一樣,如果想了解namespace的可自行查詢資料。
綜上所述,impl的作用就是用來標識哪些方法是屬於哪個結構體的。
例子:
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()); }
結果:
name: Alice
age: 18
Alice的名字叫: Alice, 她今年18歲了
在C++中存取物件的內容,一般都是使用指標和指標運運算元->
來存取物件中的屬性(成員變數)和行為(成員函數)。但是在Rust沒有和->
等效的運運算元。Rust是存在了自動參照和解除參照的功能。
當使用物件來呼叫方法時,Rust會自動為物件新增&
、&mut
或*
以便物件與方法簽名匹配,即下面的程式碼是等價的:
mm.show(); //這種方法比較簡潔 (&mm).show(); //這種方法稍微多了點東西
這種自動參照的行為之所以有效,是因為方法有一個明確的接收者———— self
的型別。在給出接收者和方法名的前提下,Rust 可以明確地計算出方法是僅僅讀取(&self
),做出修改(&mut self
)或者是獲取所有權(self
)。事實上,Rust 對方法接收者的隱式借用讓所有權在實踐中更友好。
//以下都是等效的,都可以修改age的值 mm.age = 19; (&mut mm).age = 89;
Rust 對方法接收者的隱式借用讓所有權在實踐中更友好。意思就是使用物件直接點操作就行了。
因為方法和函數是類似的,所以在方法中也是可以傳參的。
直接看一個例子就直接跳過了。
impl MM { //前面已經宣告過MM的結構體了 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()); }
結果:
Alice想吃手撕雞
結構體有意義的自定義型別。通過結構體,我們可以將相關聯的資料片段聯絡起來並命名它們,這樣可以使得程式碼更加清晰。在 impl
塊中,你可以定義與你的型別相關聯的函數,而方法是一種相關聯的函數,讓你指定結構體的範例所具有的行為。
但結構體並不是建立自定義型別的唯一方法:讓我們轉向 Rust 的列舉功能,為你的工具箱再添一個工具。
到此這篇關於Rust中的方法的文章就介紹到這了,更多相關Rust中的方法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45