最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust中的方法與關(guān)聯(lián)函數(shù)使用解讀

 更新時(shí)間:2025年02月26日 15:34:24   作者:Hello.Reader  
在Rust中,方法是定義在特定類型(如struct)的impl塊中,第一個(gè)參數(shù)是self(可變或不可變),方法用于描述該類型實(shí)例的行為,而關(guān)聯(lián)函數(shù)則不包含self參數(shù),常用于構(gòu)造新實(shí)例或提供一些與實(shí)例無關(guān)的功能,Rust的自動(dòng)引用和解引用特性使得方法調(diào)用更加簡潔

1. 方法(Methods)是什么?

在 Rust 里,方法和函數(shù)的定義方式很像:

  • 都使用 fn 來聲明。
  • 都能擁有參數(shù)和返回值。
  • 都包含一段在被調(diào)用時(shí)執(zhí)行的代碼邏輯。

不同點(diǎn)在于: 方法必須定義在某個(gè)具體類型(比如 struct、enum 或者在某個(gè) trait 對象里)的上下文中。而且方法的第一個(gè)參數(shù)固定要寫成 self(可以是 self、&self 或者 &mut self),用來代表調(diào)用該方法的具體實(shí)例。

讓我們來看看一個(gè)簡單示例。假設(shè)我們有一個(gè) Rectangle 結(jié)構(gòu)體:

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

如果你想為 Rectangle 實(shí)例添加一個(gè)計(jì)算面積的功能,我們可以在 impl(implementation)塊中為它定義一個(gè)方法 area

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}
  • 這里 impl Rectangle { ... } 表示這個(gè)塊里的所有函數(shù)都與 Rectangle 類型相關(guān)聯(lián)。
  • fn area(&self) -> u32 說明:這是一個(gè)方法,第一個(gè)參數(shù)是 &self,表示以不可變引用的形式訪問當(dāng)前調(diào)用該方法的 Rectangle 實(shí)例。
  • self.widthself.height 即代表該實(shí)例的字段。用 self 訪問字段非常直觀。

main 函數(shù)中,當(dāng)我們創(chuàng)建一個(gè)矩形實(shí)例后,就可以使用方法語法來獲取面積:

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };
    
    println!("rect1 的面積是:{}", rect1.area());
}

運(yùn)行后,會(huì)輸出:

rect1 的面積是:1500

2. 為什么要使用 &self 而不是 &Rectangle?

在我們將 area 從一個(gè)普通函數(shù)重構(gòu)為一個(gè)方法時(shí),你會(huì)注意到,函數(shù)簽名由原本的

fn area(rectangle: &Rectangle) -> u32 { ... }

變?yōu)?/p>

fn area(&self) -> u32 { ... }

這是因?yàn)樵?impl Rectangle 這個(gè)上下文中,Rust 給出了一個(gè)更具可讀性的方式:讓第一個(gè)參數(shù)自動(dòng)變?yōu)?self,而 Self 則是當(dāng)前實(shí)現(xiàn)塊對應(yīng)的類型別名。

如果你需要修改實(shí)例的字段,你可以將第一個(gè)參數(shù)寫為 &mut self;如果需要獲取所有權(quán)并可能在方法內(nèi)部把它“轉(zhuǎn)化”成別的東西,則用 self。但這種把所有權(quán)轉(zhuǎn)移給方法本身的做法很少見。

在大多數(shù)情況下,我們只是想讀一下結(jié)構(gòu)體數(shù)據(jù)而不改變它,這時(shí)使用 &self 最為常見,也能讓調(diào)用者繼續(xù)使用這個(gè)實(shí)例。

3. 同名字段與同名方法

如果你在 Rectangle 內(nèi)也有一個(gè)字段叫做 width,同時(shí)還想定義一個(gè)方法也叫 width,這是合法的。比如:

impl Rectangle {
    fn width(&self) -> bool {
        self.width > 0
    }
}

在調(diào)用時(shí):

  • rect.width (不帶括號(hào))訪問的是字段 width 的數(shù)值。
  • rect.width() (帶括號(hào))調(diào)用的是同名方法,返回一個(gè)布爾值。

在很多語言中,如果你只想單純地返回字段值,會(huì)把這種方法稱為“getter”。

Rust 并不會(huì)為你自動(dòng)生成 getter,但你可以自行定義。

這樣一來,你可以只把字段設(shè)為私有,但對外公開這個(gè)只讀方法,讓外部安全地訪問它。

4. 借用與解引用:為什么在調(diào)用方法時(shí)不需要寫 & 或 *?

在 C/C++ 中,如果你要通過指針來調(diào)用成員函數(shù),需要寫 ->?;蛘?,如果你手頭是指針,還要顯式地 (*object).method() 等。

在 Rust 中則不需要這么麻煩,因?yàn)?strong>自動(dòng)引用和解引用讓你可以直接寫 object.method()。

實(shí)際上,這些調(diào)用是一樣的:

p1.distance(&p2);
(&p1).distance(&p2);

Rust 會(huì)根據(jù)方法簽名(第一個(gè)參數(shù)是 &self、&mut self 還是 self)來自動(dòng)推斷是否需要幫你加 &、&mut 或者 *。這大大簡化了調(diào)用方法時(shí)的語法。

5. 方法可以擁有多個(gè)參數(shù)

方法和函數(shù)在參數(shù)上并沒什么區(qū)別,除了第一個(gè)參數(shù)是 self 以外,其他參數(shù)你可以自由添加。

舉例來說,為 Rectangle 再定義一個(gè)方法 can_hold,用來檢查“當(dāng)前矩形”是否可以完全容納另一個(gè)矩形:

impl Rectangle {
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

然后這樣使用它:

fn main() {
    let rect1 = Rectangle { width: 30, height: 50 };
    let rect2 = Rectangle { width: 10, height: 40 };
    let rect3 = Rectangle { width: 60, height: 45 };

    println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2)); // true
    println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3)); // false
}

6. 關(guān)聯(lián)函數(shù)(Associated Functions)

如果在 impl 塊中定義的函數(shù)沒有 self 參數(shù),那它就不是方法(method),而是關(guān)聯(lián)函數(shù)(associated function)。

關(guān)聯(lián)函數(shù)常被用來提供類似“構(gòu)造函數(shù)”的功能。

舉個(gè)例子,如果你想快速構(gòu)造一個(gè)“正方形”:

impl Rectangle {
    // 關(guān)聯(lián)函數(shù)
    fn square(size: u32) -> Self {
        Self {
            width: size,
            height: size,
        }
    }
}

調(diào)用的時(shí)候,使用 :: 語法來調(diào)用關(guān)聯(lián)函數(shù):

fn main() {
    let sq = Rectangle::square(3);
    println!("正方形 sq: {:#?}", sq);
}

打印結(jié)果為:

正方形 sq: Rectangle {
    width: 3,
    height: 3
}

在標(biāo)準(zhǔn)庫里,我們也經(jīng)??吹竭@種關(guān)聯(lián)函數(shù),比如 String::from("Hello")。它不需要某個(gè)已存在的 String 實(shí)例,就可以直接調(diào)用,用來創(chuàng)建一個(gè)新的字符串。

7. 多個(gè) impl 塊

你可以為同一個(gè)類型寫多個(gè) impl 塊,比如:

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

impl Rectangle {
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

這與把它們寫在同一個(gè) impl 中沒有本質(zhì)差別。之所以 Rust 允許你分開寫,是為了在某些情況下(比如涉及到泛型、trait 實(shí)現(xiàn)等)組織代碼更靈活。

8. 總結(jié)

  • 方法:必須定義在某個(gè)類型(如 struct)的 impl 塊中,第一個(gè)參數(shù)是 self(可變或不可變)。方法往往用于描述該類型實(shí)例的某些行為,讀或?qū)懫鋬?nèi)部數(shù)據(jù)。
  • 關(guān)聯(lián)函數(shù):在 impl 塊里定義但不包含 self 參數(shù)的函數(shù)。常用于構(gòu)造新實(shí)例或提供一些與實(shí)例無關(guān)的功能。
  • Rust 擁有自動(dòng)引用和解引用特性,讓我們可以簡潔地使用 object.method() 來調(diào)用方法。
  • 多個(gè) impl 塊可以并存,給代碼的組織提供了很大靈活性。

通過為自定義類型定義方法,我們不僅能讓代碼更具可讀性,把相關(guān)的行為放到同一個(gè) impl 塊中,也能充分利用所有權(quán)、借用等特性來保證內(nèi)存安全和并發(fā)安全。

希望這篇文章能幫你搞清楚在 Rust 中如何編寫方法、何時(shí)使用 &self、&mut self、self,以及如何借助關(guān)聯(lián)函數(shù)讓代碼更簡潔優(yōu)雅。

如果你還對 Rust 中的枚舉(enum)或 trait 有興趣,不妨繼續(xù)閱讀之后的章節(jié),它們和 struct 一樣,也是構(gòu)建復(fù)雜邏輯的重要工具。

當(dāng)然,以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Rust字符串類型全解析(最新推薦)

    Rust字符串類型全解析(最新推薦)

    Rust語言中,字符串類型眾多,設(shè)計(jì)初衷是為了確保程序的安全、高效和靈活性,本文詳細(xì)解釋了Rust中不同的字符串類型,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Rust CLI 項(xiàng)目構(gòu)建的實(shí)現(xiàn)步驟

    Rust CLI 項(xiàng)目構(gòu)建的實(shí)現(xiàn)步驟

    本文提供了一個(gè)完整的Rust CLI項(xiàng)目構(gòu)建流程,以 anthropic-config 配置管理工具為例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • Rust?Postgres實(shí)例代碼

    Rust?Postgres實(shí)例代碼

    Rust Postgres是一個(gè)純Rust實(shí)現(xiàn)的PostgreSQL客戶端庫,本文主要介紹了Rust?Postgres實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Rust并發(fā)編程之使用消息傳遞進(jìn)行線程間數(shù)據(jù)共享方式

    Rust并發(fā)編程之使用消息傳遞進(jìn)行線程間數(shù)據(jù)共享方式

    文章介紹了Rust中的通道(channel)概念,包括通道的基本概念、創(chuàng)建并使用通道、通道與所有權(quán)、發(fā)送多個(gè)消息以及多發(fā)送端,通道提供了一種線程間安全的通信機(jī)制,通過所有權(quán)規(guī)則確保數(shù)據(jù)安全,并且支持多生產(chǎn)者單消費(fèi)者架構(gòu)
    2025-02-02
  • 詳解Rust中的變量與常量

    詳解Rust中的變量與常量

    大多數(shù)嘗試過 Rust 的人都希望繼續(xù)使用它。但是如果你沒有使用過它,你可能會(huì)想——什么是 Rust,如何理解Rust中的變量與常量,感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • 選擇Rust的理由:極致性能、內(nèi)存安全和確定性的資源管理

    選擇Rust的理由:極致性能、內(nèi)存安全和確定性的資源管理

    文章主要介紹了Rust編程語言在內(nèi)存管理、抽象層次、性能優(yōu)化和開發(fā)體驗(yàn)等方面的優(yōu)勢,將其與C/C++、Java等語言進(jìn)行對比,并通過具體示例展示了Rust在零成本抽象、所有權(quán)系統(tǒng)、零成本迭代、無態(tài)化等、零成本錯(cuò)誤處理和高效并發(fā)等特性,文章還分析了這些特性的實(shí)現(xiàn)原理和優(yōu)勢
    2026-05-05
  • rust類型轉(zhuǎn)換的實(shí)現(xiàn)

    rust類型轉(zhuǎn)換的實(shí)現(xiàn)

    Rust是類型安全的語言,因此在Rust中做類型轉(zhuǎn)換不是一件簡單的事,本文主要介紹了rust類型轉(zhuǎn)換的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Rust 語言的全鏈路追蹤庫 tracing使用方法

    Rust 語言的全鏈路追蹤庫 tracing使用方法

    這篇文章主要介紹了Rust 語言的全鏈路追蹤庫 tracing,接下來就以 tracing 為例,介紹一下trace 的核心概念以及使用方法,需要的朋友可以參考下
    2022-12-12
  • Rust讀取配置文件的實(shí)現(xiàn)步驟

    Rust讀取配置文件的實(shí)現(xiàn)步驟

    任何項(xiàng)目都離不開對于配置文件的讀取和解析,rust項(xiàng)目也一樣,本文主要介紹了Rust讀取配置文件的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Rust 文檔注釋功能示例代碼

    Rust 文檔注釋功能示例代碼

    Rust的文檔注釋使用特定的格式,以便通過 rustdoc工具生成 API 文檔,本文給大家介紹Rust 文檔注釋功能,感興趣的朋友跟隨小編一起看看吧
    2024-04-04

最新評論

英超| 治多县| 庐江县| 盐城市| 淅川县| 淮南市| 海口市| 施甸县| 九龙坡区| 宜宾市| 钦州市| 石门县| 伊春市| 乐都县| 湛江市| 怀远县| 凤山市| 马山县| 泰兴市| 丹巴县| 四子王旗| 黄梅县| 乾安县| 青田县| 博爱县| 华宁县| 新竹市| 柳河县| 富裕县| 香港| 北宁市| 鸡西市| 永宁县| 荥阳市| 团风县| 青浦区| 同江市| 抚松县| 武胜县| 合肥市| 合川市|