如何将 Rc<RefCell<dyn T>> 传递给想要 &dyn T 的 fn?
Posted
技术标签:
【中文标题】如何将 Rc<RefCell<dyn T>> 传递给想要 &dyn T 的 fn?【英文标题】:How to pass Rc<RefCell<dyn T>> to fn that wants &dyn T? 【发布时间】:2020-05-26 20:05:23 【问题描述】:我无法将参数传递给 fn。
trait T
struct S
others: Vec<Rc<RefCell<dyn T>>>
impl S
fn bar(&self)
for o in self.others
foo(&o.borrow());
fn foo(t: &dyn T)
编译器告诉我:
error[E0277]: the trait bound `std::cell::Ref<'_, (dyn T + 'static)>: T` is not satisfied
--> src/lib.rs:14:17
|
14 | foo(&o.borrow());
| ^^^^^^^^^^^ the trait `T` is not implemented for `std::cell::Ref<'_, (dyn T + 'static)>`
|
= note: required for the cast to the object type `dyn T`
我认为这就像 rust book 中的 example 一样,其中 Rc
被自动取消引用,并且要从 RefCell 中获取值,我可以调用 borrow()
。
我也尝试过显式取消引用,但似乎没有任何效果。
如何为self
中的每个dyn T
对象调用foo()
?
【问题讨论】:
【参考方案1】:正如错误所说,Ref<X>
不会自动实现 X
实现的每个特征。对于要强制转换为 trait 对象的类型,它需要实现该 trait。
您可以显式取消引用Ref
,然后再次借用它:
impl S
fn bar(&self)
for o in &self.others
foo(&*o.borrow());
【讨论】:
当我使用它时,我得到一个类似的编译器错误,说没有为 RcBorrow
,你可以明确使用RefCell
:foo(&*RefCell::borrow(&o))
以上是关于如何将 Rc<RefCell<dyn T>> 传递给想要 &dyn T 的 fn?的主要内容,如果未能解决你的问题,请参考以下文章
Rc<RefCell<T>> 和 RefCell<Rc<T>> 有啥区别?
Rc<RefCell<T>> 和 RefCell<Rc<T>> 有啥区别?
Rayon 如何防止线程之间使用 RefCell<T>、Cell<T> 和 Rc<T>?