繁体   English   中英

结构不会强制在 function 返回中实现 dyn Trait 类型

[英]Struct won't coerce to implemented dyn Trait type in function return

我有以下 Rust 代码

use std::{
    cell::{Ref, RefCell},
    rc::Rc,
};

trait TraitA {
    fn data(&self) -> Ref<Vec<Rc<dyn TraitB>>>;
}

struct A {
    data: RefCell<Vec<Rc<B>>>,
}

impl TraitA for A {
    fn data(&self) -> Ref<Vec<Rc<dyn TraitB>>> {
        self.data.borrow()
    }
}

trait TraitB {}

struct B {}

impl TraitB for B {}

但是我收到以下错误

error[E0308]: mismatched types
  --> src/lib.rs:16:9
   |
15 |     fn data(&self) -> Ref<Vec<Rc<dyn TraitB>>> {
   |                       ------------------------ expected `Ref<'_, Vec<Rc<(dyn TraitB + 'static)>>>` because of return type
16 |         self.data.borrow()
   |         ^^^^^^^^^^^^^^^^^^ expected trait object `dyn TraitB`, found struct `B`
   |
   = note: expected struct `Ref<'_, Vec<Rc<(dyn TraitB + 'static)>>>`
              found struct `Ref<'_, Vec<Rc<B>>>`

我尝试将A中的data字段设置为RefCell<Vec<Rc<dyn TraitB>>>类型。 那可行。

但是在我的实现中,我希望该字段包含B类型,因为我希望 Vec存储类型B ,而不是TraitB的任何实现。

我的理解是 Rust 应该能够根据需要强制转换B类型,只要它实现了特征TraitB ,在上面的例子中, B确实实现TraitB

例如,在以下代码段中, Rc<dyn TraitB>成功强制转换为Rc<B>没问题。

struct C {
    weak_ref: Weak<B>,
}

impl C {
    fn upgrade_weak_ref(&self) -> Rc<dyn TraitB> {
        self.weak_ref.upgrade().unwrap()
    }
}

所以我的问题是,为什么强制在上面的第一个例子中不起作用。 是因为它包含在Ref中吗? 是否有解决方法或某种方法可以在不更改 struct Adata字段类型的情况下使其工作?

Rc<dyn TraitB>的大小是Rc<B>的两倍(两种用途对一种用途)。 因此,没有办法在不重建向量的情况下将Vec<Rc<B>>强制转换为Vec<Rc<dyn TraitB>>

您可以存储Vec<Rc<dyn TraitB>> ,但只有推送B的方法,因此可以防止误用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM