国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【rust語言】rust多態(tài)實(shí)現(xiàn)方式

這篇具有很好參考價(jià)值的文章主要介紹了【rust語言】rust多態(tài)實(shí)現(xiàn)方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言

學(xué)習(xí)rust當(dāng)中遇到了這個(gè)問題,記錄一下,不對(duì)地方望指正

一、多態(tài)

多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)中的一個(gè)重要概念,指同一個(gè)行為或操作在不同實(shí)例上具有不同的行為或結(jié)果。簡單來說,多態(tài)就是指同一種類型的對(duì)象,在不同的上下文中有不同的行為。多態(tài)性使得程序可以更加靈活、可擴(kuò)展和易于維護(hù)。在實(shí)現(xiàn)多態(tài)性時(shí),通常會(huì)使用繼承、接口、抽象類等技術(shù)

二、rust實(shí)現(xiàn)多態(tài)

trait的靜態(tài)方式


trait Animal {
    fn make_sound(&self);
}
struct Cat {}

impl Animal for Cat {
    fn make_sound(&self) {
        println!("Meow");
    }
}
struct Dog {}

impl Animal for Dog {
    fn make_sound(&self) {
        println!("Woof");
    }
}


fn main() {
    let cat: Cat = Cat {};
    let dog: Dog = Dog {};
    test(cat);
    test(dog)
}
//接受Animal Trait類型的
fn test(animal : impl Animal){
    animal.make_sound()
}

定義了方法傳入?yún)?shù)是trait。這一種在實(shí)例化的時(shí)候是具體的類型,在傳參的時(shí)候編譯器能推斷出來具體是cat還是dog,能調(diào)用具體方法

還有一種方式可以通過動(dòng)態(tài)分發(fā),還以上面那段代碼,比如

trait Animal {
    fn make_sound(&self);
}

struct Cat {}

impl Animal for Cat {
    fn make_sound(&self) {
        println!("Meow");
    }
}

struct Dog {}

impl Animal for Dog {
    fn make_sound(&self) {
        println!("Woof");
    }
}

fn main() {
    let cat: Box<dyn Animal> = Box::new(Cat {});
    let dog: Box<dyn Animal> = Box::new(Dog {});

    test(cat);
    test(dog)
}

fn test(animal: Box<dyn Animal>) {
    animal.make_sound()
}

這種方式相對(duì)于上面更加靈活,因?yàn)閷?shí)例化參數(shù)變量類型是trait類型。現(xiàn)在說說關(guān)鍵點(diǎn)

dyn關(guān)鍵字

dyn關(guān)鍵字是在Rust中用于創(chuàng)建和使用動(dòng)態(tài)分發(fā)的trait對(duì)象的關(guān)鍵字。trait對(duì)象允許我們以統(tǒng)一的方式處理不同類型的對(duì)象,并使用相同的方法調(diào)用語法。使用動(dòng)態(tài)分發(fā),編譯器無需在編譯時(shí)知道具體的類型,而是在運(yùn)行時(shí)根據(jù)對(duì)象的實(shí)際類型來確定要調(diào)用的方法。要?jiǎng)?chuàng)建一個(gè)trait對(duì)象,需要在trait名稱前加上dyn關(guān)鍵字。例如,對(duì)于名為TraitName的trait,我們可以使用dyn TraitName來創(chuàng)建一個(gè)trait對(duì)象。

trait TraitName {
    // trait定義
}

fn main() {
    let trait_obj: Box<dyn TraitName> = Box::new(ConcreteType);
    // 在這里使用trait對(duì)象
}

在上面的代碼中,trait_obj是一個(gè)Box指向動(dòng)態(tài)分發(fā)的trait對(duì)象的指針。它可以存儲(chǔ)實(shí)現(xiàn)了TraitName trait的任何具體類型的對(duì)象。通過dyn關(guān)鍵字,我們可以在運(yùn)行時(shí)根據(jù)實(shí)際類型來調(diào)用trait定義的方法。
這里要注意,trait對(duì)象通過指針或引用來操作,因此通常結(jié)合使用Box、&或&mut來創(chuàng)建和使用trait對(duì)象。為了在運(yùn)行時(shí)確定對(duì)象的大小,我們需要將它們放置在一個(gè)固定大小的容器中。這就是為什么要使用Box來包裝trait對(duì)象的原因。Box類型表示一個(gè)動(dòng)態(tài)分發(fā)的trait對(duì)象。它在堆上分配一塊內(nèi)存,該內(nèi)存用于存儲(chǔ)對(duì)象的數(shù)據(jù),并提供一個(gè)指向虛函數(shù)表(vtable)的指針,該表用于在運(yùn)行時(shí)查找和調(diào)用正確的方法。
這種方式相對(duì)于靜態(tài)方式會(huì)更加靈活,但會(huì)有運(yùn)行時(shí)性能損失,看情況決定使用哪一種

泛型方式

use std::fmt::{Display, Formatter};

struct Cat {}

struct Dog {}

impl Display for Cat{
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f,"Cat")
    }
}

impl Display for Dog{
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f,"Dog")
    }
}

fn make_sound<T: Display>(animal: T) {
    println!("{}", animal);
}

fn main() {
    make_sound(Cat{});
    make_sound(Dog{});
}

通過在函數(shù)簽名中使用泛型類型參數(shù),函數(shù)可以接受不同類型的參數(shù),并在編譯時(shí)生成對(duì)應(yīng)的具體化代碼。這種方式不依賴于trait,而是基于類型推斷和編譯時(shí)的靜態(tài)分發(fā)

枚舉方式

還有一種方式是使用枚舉方式,例如

enum Shape {
    Circle(f64),
    Square(f64),
    Rectangle(f64, f64),
}

impl Shape {
    fn area(&self) -> f64 {
        match *self {
            Shape::Circle(radius) => std::f64::consts::PI * radius * radius,
            Shape::Square(side_length) => side_length * side_length,
            Shape::Rectangle(length, width) => length * width,
        }
    }
}

fn main() {
    let circle = Shape::Circle(5.0);
    let square = Shape::Square(4.0);
    let rectangle = Shape::Rectangle(3.0, 6.0);

    test(circle);
    test(square);
    test(rectangle);
}

fn test(shape: Shape) {
    println!("shape area: {}", shape.area());
}

枚舉在實(shí)現(xiàn)多態(tài)性方面有一些優(yōu)點(diǎn)和缺點(diǎn)。以下是其中的一些:

優(yōu)點(diǎn):

簡潔性:枚舉提供了一種緊湊的方式來定義和組織具有不同變體的數(shù)據(jù)類型。它能夠在一個(gè)地方集中描述和管理多種可能的狀態(tài)或情況。
靜態(tài)類型檢查:由于枚舉的變體是預(yù)先定義的,編譯器可以在編譯時(shí)驗(yàn)證變體的正確性。這可以幫助捕捉到潛在的錯(cuò)誤,并提供類型安全性。
模式匹配:枚舉與模式匹配相結(jié)合,可以使代碼更具表達(dá)力和可讀性。模式匹配可以根據(jù)具體的變體類型執(zhí)行相應(yīng)的邏輯,同時(shí)處理所有可能的情況,避免遺漏。

缺點(diǎn):

限制的擴(kuò)展性:當(dāng)需要添加新的變體時(shí),枚舉需要進(jìn)行修改。這可能涉及到修改已有的代碼,以適應(yīng)新的變體。這對(duì)于外部庫或包的枚舉類型來說尤其困難,因?yàn)闊o法直接修改其定義。
冗余的結(jié)構(gòu):枚舉的每個(gè)變體都可以存儲(chǔ)不同的數(shù)據(jù)結(jié)構(gòu),這可能會(huì)導(dǎo)致某些變體擁有與其他變體不相關(guān)的冗余數(shù)據(jù)。這可能會(huì)浪費(fèi)內(nèi)存空間,尤其是當(dāng)只使用其中的一部分變體時(shí)。
靈活性的限制:枚舉要求提前定義所有可能的變體。如果需要在運(yùn)行時(shí)動(dòng)態(tài)添加新的變體,或者處理不確定的類型集合,那么枚舉可能不適合。

總結(jié)

以上就是今天要說的內(nèi)容,不對(duì)的地方望指正文章來源地址http://www.zghlxwxcb.cn/news/detail-677376.html

到了這里,關(guān)于【rust語言】rust多態(tài)實(shí)現(xiàn)方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【跟小嘉學(xué) Rust 編程】十七、面向?qū)ο笳Z言特性

    【跟小嘉學(xué) Rust 編程】一、Rust 編程基礎(chǔ) 【跟小嘉學(xué) Rust 編程】二、Rust 包管理工具使用 【跟小嘉學(xué) Rust 編程】三、Rust 的基本程序概念 【跟小嘉學(xué) Rust 編程】四、理解 Rust 的所有權(quán)概念 【跟小嘉學(xué) Rust 編程】五、使用結(jié)構(gòu)體關(guān)聯(lián)結(jié)構(gòu)化數(shù)據(jù) 【跟小嘉學(xué) Rust 編程】六、枚舉

    2024年02月10日
    瀏覽(36)
  • c、c++、java、python、js對(duì)比【面向?qū)ο蟆⑦^程;解釋、編譯語言;封裝、繼承、多態(tài)】

    c、c++、java、python、js對(duì)比【面向?qū)ο?、過程;解釋、編譯語言;封裝、繼承、多態(tài)】

    目錄 內(nèi)存管理、適用 區(qū)別 C 手動(dòng)內(nèi)存管理:C語言沒有內(nèi)置的安全檢查機(jī)制,容易出現(xiàn)內(nèi)存泄漏、緩沖區(qū)溢出等安全問題。 適用于系統(tǒng)級(jí)編程 C++ 手動(dòng)內(nèi)存管理:C++需要程序員手動(dòng)管理內(nèi)存,包括分配和釋放內(nèi)存,這可能導(dǎo)致內(nèi)存泄漏和指針錯(cuò)誤。 適用于游戲引擎和系統(tǒng)級(jí)編

    2024年02月08日
    瀏覽(51)
  • 面向?qū)ο笤斀?,面向?qū)ο蟮娜筇卣鳎悍庋b、繼承、多態(tài)

    面向?qū)ο笤斀猓嫦驅(qū)ο蟮娜筇卣鳎悍庋b、繼承、多態(tài)

    一、面向?qū)ο笈c面向過程 面向?qū)ο缶幊?(Object-Oriented Programming,簡稱OOP)和 面向過程編程 (Procedural Programming,簡稱PP)是兩種不同的 編程范式 。 面向?qū)ο缶幊虖?qiáng)調(diào)把問題分解成對(duì)象,通過封裝、繼承和多態(tài)等機(jī)制,來處理對(duì)象之間的關(guān)系 。每個(gè)對(duì)象都可以獨(dú)立地處理自

    2024年02月21日
    瀏覽(23)
  • 面向?qū)ο蟆鄳B(tài)、抽象類、接口

    面向?qū)ο蟆鄳B(tài)、抽象類、接口

    學(xué)習(xí)資料來自:黑馬程序員,內(nèi)容僅為學(xué)習(xí)記錄,侵刪 多態(tài) 多態(tài):事務(wù)存在的多種形態(tài) 多態(tài)的前提:1、有繼承關(guān)系;2、重寫父類方法;3、父類引用指向子類對(duì)象 面向?qū)ο?面向?qū)ο蠖鄳B(tài)中成員訪問特點(diǎn) 1.成員方法(動(dòng)態(tài)綁定):編譯看左邊(父類),運(yùn)行看右邊(子類)

    2024年02月08日
    瀏覽(28)
  • 面向?qū)ο蟮亩鄳B(tài)

    面向?qū)ο蟮亩鄳B(tài)

    7. 面向?qū)ο筇卣魅憾鄳B(tài)性 概念: 多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)的一個(gè)重要特征,指同一個(gè)實(shí)體同時(shí)具有多種形式, 女朋友養(yǎng)寵物 王者榮耀英雄 7.1 多態(tài)的形式和體現(xiàn) 7.1.1 對(duì)象的多態(tài)性 多態(tài)性,是面向?qū)ο笾凶钪匾母拍睿?在 Java 中如何體現(xiàn)的:對(duì)象的多態(tài)性:父類的

    2024年02月08日
    瀏覽(37)
  • Java面向?qū)ο蠖鄳B(tài)

    目錄 多態(tài)概述 Java 多態(tài)包括以下三種方式 方法重寫(Override) 向上轉(zhuǎn)型(Upcasting) 實(shí)現(xiàn)多態(tài) Java 多態(tài)是指同一種類型的對(duì)象,在不同的情況下有著不同的狀態(tài)和行為。它是基于繼承、重寫和向上轉(zhuǎn)型等特性實(shí)現(xiàn)的,多態(tài)是面向?qū)ο缶幊痰娜筇卣髦?,其他兩個(gè)分別是封裝

    2023年04月13日
    瀏覽(20)
  • 【C++】面向?qū)ο笾鄳B(tài)

    【C++】面向?qū)ο笾鄳B(tài)

    文章內(nèi)的所有調(diào)試都是在vs2022下進(jìn)行的, 部分小細(xì)節(jié)可能因編譯器不同存在差異。 概念引入 對(duì)于一個(gè)火車票售票系統(tǒng), 可能會(huì)有多重角色, 比如普通成人類、學(xué)生類、軍人類、兒童類等等… 這些類可能都是從某個(gè)基類派生出來的, 而且每個(gè)類都有一個(gè)基本需求,就是買票

    2024年02月01日
    瀏覽(25)
  • 【JavaSE】面向?qū)ο笾鄳B(tài)

    【JavaSE】面向?qū)ο笾鄳B(tài)

    通俗來說,就是多種形態(tài),具體點(diǎn)就是去完成某個(gè)行為,當(dāng)不同的對(duì)象去完成時(shí)會(huì)產(chǎn)生出不同的狀態(tài)。 必須要滿足如下幾個(gè)條件,缺一不可: 必須在 繼承 體系下 子類必須要對(duì)父類中方法進(jìn)行 重寫 通過父類的引用調(diào)用重寫的方法 定義測(cè)試類TestAnimal.java 編譯器在編譯代碼時(shí)

    2024年02月11日
    瀏覽(25)
  • 面向?qū)ο?類/繼承/封裝/多態(tài))詳解

    面向?qū)ο?類/繼承/封裝/多態(tài))詳解

    面向?qū)ο缶幊蹋∣bject-Oriented Programming,OOP)是一種廣泛應(yīng)用于軟件開發(fā)的編程范式。它基于一系列核心概念,包括類、繼承、封裝和多態(tài)。在這篇詳細(xì)的解釋中,我們將探討這些概念,并說明它們?nèi)绾卧赑HP等編程語言中實(shí)現(xiàn)。 類是OOP的基礎(chǔ)。它是一種用于創(chuàng)建對(duì)象的藍(lán)圖或模

    2024年02月08日
    瀏覽(24)
  • C++ 面向?qū)ο笕筇匦浴鄳B(tài)

    C++ 面向?qū)ο笕筇匦浴鄳B(tài)

    ?1主頁:我的代碼愛吃辣 ??2知識(shí)講解:C++ 繼承 ??3開發(fā)環(huán)境:Visual Studio 2022 ??4前言:面向?qū)ο笕筇匦缘?,封裝,繼承,多態(tài),今天我們研究研究 C++的多態(tài) 。 目錄 一.多態(tài)的概念 二.多態(tài)的定義及實(shí)現(xiàn) 1.多態(tài)的構(gòu)成條件 2. 虛函數(shù) 3.虛函數(shù)的重寫 4. C++11 override 和 fina

    2024年02月12日
    瀏覽(92)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包