Rust从入门到实战系列二百八十八:特征对象

在特征练习中 我们已经知道当函数返回多个类型时, impl Trait 是无法使用的。
对于数组而言,其中一个限制就是无法存储不同类型的元素,但是通过之前的学习,大家应该知道枚举可
以在部分场景解决这种问题,但是这种方法局限性较大。此时就需要我们的主角登场了。
使用 dyn 返回特征
Rust 编译器需要知道一个函数的返回类型占用多少内存空间。由于特征的不同实现类型可能会占用不同的
内存,因此通过 impl Trait 返回多个类型是不被允许的,但是我们可以返回一个 dyn 特征对象来解决
问题。

  1. 🌟🌟🌟
    trait Bird {
    fn quack(&self) -> String;
    }
    struct Duck;
    impl Duck {
    fn swim(&self) {
    println!(“Look, the duck is swimming”)
    }
    }
    struct Swan;
    impl Swan {
    fn fly(&self) {
    println!(“Look, the duck… oh sorry, the swan is flying”)
    }
    }
    impl Bird for Duck {
    fn quack(&self) -> String{
    “duck duck”.to_string()
    }
    }
    impl Bird for Swan {
    fn quack(&self) -> String{
    “swan swan”.to_string()
    }
    }
    fn main() {
    // 填 空
    let duck = __;
    duck.swim();
    let bird = hatch_a_bird(2);
    // 变 成 鸟 儿 后 , 它 忘 记 了 如 何 游 , 因 此 以 下 代 码 会 报 错
    // bird.swim();
    // 但 它 依 然 可 以 叫 唤
    // 但 它 依 然 可 以 叫 唤
    assert_eq!(bird.quack(), “duck duck”);
    let bird = hatch_a_bird(1);
    // 这 只 鸟 儿 忘 了 如 何 飞 翔 , 因 此 以 下 代 码 会 报 错
    // bird.fly();
    // 但 它 也 可 以 叫 唤
    assert_eq!(bird.quack(), “swan swan”);
    println!(“Success!”)
    }
    // 实 现 以 下 函 数
    fn hatch_a_bird…
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值