簡體   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