日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

詳解Rust中的方法_Rust語言

作者:Cukor丘克 ? 更新時間: 2022-11-25 編程語言

Rust中的方法

方法其實就是結構體的成員函數,在C語言中的結構體是沒有成員函數的,但是Rust畢竟也是一門面向對象的編程語言,所以給結構體加上方法的特性很符合面向對象的特點。

方法的簡單概念

方法(method)與函數類似:它們使用 fn 關鍵字和名稱聲明,可以擁有參數和返回值,同時包含在某處調用該方法時會執行的代碼。不過方法與函數是不同的,因為它們在結構體的上下文中被定義,并且它們第一個參數總是 self,它代表調用該方法的結構體實例。

&self 實際上是 self: &Self 的縮寫,在一個 impl 塊中,Self 類型是 impl 塊的類型的別名。方法的第一個參數必須有一個名為 selfSelf 類型的參數,所以 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

欄目分類
最近更新