日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Rust-dyn 关键字

發布時間:2023/12/19 综合教程 25 生活家
生活随笔 收集整理的這篇文章主要介紹了 Rust-dyn 关键字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

dyn是trait對象類型的前綴

dyn關鍵字用于強調相關trait的方法是動態分配的。要以這種方式使用trait,它必須是“對象安全”的。

與泛型參數或植入型特質不同,編譯器不知道被傳遞的具體類型。也就是說,該類型已經被抹去。因此,一個dyn Trait引用包含兩個指針。一個指針指向數據(例如,一個結構的實例)。另一個指針指向方法調用名稱與函數指針的映射(被稱為虛擬方法表各vtable)。

impl trait 和 dyn trait 在Rust分別被稱為靜態分發和動態分發,即當代碼涉及多態時,需要某種機制決定實際調動類型。

使用dyn返回trait

Rust編譯器需要知道每個函數的返回類型需要多少空間。這意味著所有函數都必須返回一個具體類型。我們通過以下示例1來展示:

文件名: src/lib.rs

pub trait Animal {
    fn noise(&self);
}

pub struct Sheep {}

pub struct Cow {}

impl Animal for Sheep {
    fn noise(&self){
        println!("mamamama!");
    }
}

impl Animal for Cow {
    fn noise(&self) {
        println!("moooooo!");
    }
}

示例1有trait Animal,我們不能編寫返回Animal的函數,因為其不同的實將需要不同的內存量。

但是,有一個簡單的解決方法。相比直接返回一個trait對象,我們的函數返回一個包含一些Animal的Box。box只是對堆中某些內存的引用。因為引用的大小是靜態已知的,并且編譯器可以保證引用指向已分配的堆Animal,所以我們可以從函數中返回trait。

每當在堆上分配內存時,Rust都會嘗試盡可能明確。因此,如果你的函數以這種方式返回指向堆的trait指針,則需要使用dyn關鍵字編寫返回類型,如示例2:

文件名:src/main.rs

fn random_animal(random_number: f64) -> Box<dyn Animal> {
    if random_number < 0.5 {
        Box::new(Sheep {})
    } else {
        Box::new(Cow {})
    }
}
    let random_number = 0.234;
    let animal = random_animal(random_number);
    animal.noise();

總結

以上是生活随笔為你收集整理的Rust-dyn 关键字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。