網站首頁 編程語言 正文
Rust中的方法
方法其實就是結構體的成員函數,在C語言中的結構體是沒有成員函數的,但是Rust畢竟也是一門面向對象的編程語言,所以給結構體加上方法的特性很符合面向對象的特點。
方法的簡單概念
方法(method)與函數類似:它們使用 fn
關鍵字和名稱聲明,可以擁有參數和返回值,同時包含在某處調用該方法時會執行的代碼。不過方法與函數是不同的,因為它們在結構體的上下文中被定義,并且它們第一個參數總是 self
,它代表調用該方法的結構體實例。
&self
實際上是self: &Self
的縮寫,在一個impl
塊中,Self
類型是impl
塊的類型的別名。方法的第一個參數必須有一個名為self
的Self
類型的參數,所以 Rust 讓你在第一個參數位置上只用self
這個名字來縮寫。傳參的時候可以忽略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歲了
Rust自動引用和解引用
在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 的枚舉功能,為你的工具箱再添一個工具。
原文鏈接:https://blog.csdn.net/qq_53744721/article/details/127342097
相關推薦
- 2022-08-12 windows?bat批處理判斷電腦服務是否運行的問題_DOS/BAT
- 2022-03-24 go語言開發環境配置(sublime?text3+gosublime)_Golang
- 2023-05-30 基于CUDA?out?of?memory的一種神奇解決方式_python
- 2022-10-01 Go語言異步API設計的扇入扇出模式詳解_Golang
- 2022-09-15 C/C++?左移<<,?右移>>的作用及說明_C 語言
- 2022-06-22 C++深入探究類與對象之對象模型與this指針使用方法_C 語言
- 2022-04-21 python工廠方法模式原理與實現_python
- 2022-12-04 C++?Boost?Graph算法超詳細精講_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支