• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Rust-dyn关键字

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

dyn是trait对象类型的前缀

dyn关键字用于强调相关trait的方法是动态分配的。要以这种方式使用trait,它必须是“对象安全”的。

与泛型参数或植入型特质不同,编译器不知道被传递的具体类型。也就是说,该类型已经被抹去。因此,一个dyn Trait引用包含两个指针。一个指针指向数据(例如,一个结构的实例)。另一个指针指向方法调用名称与函数指针的映射(被称为虚拟方法表各vtable)。

impl traitdyn 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();

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
matlab mex 编译C sparsenet库发布时间:2022-07-18
下一篇:
Matlab连接Sql server数据库发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap