首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Rc<RefCell<ConcreteType>>转换为Rc<RefCell<dyn Trait>>?

如何将Rc<RefCell<ConcreteType>>转换为Rc<RefCell<dyn Trait>>?
EN

Stack Overflow用户
提问于 2020-12-29 16:17:47
回答 1查看 365关注 0票数 4

我正在尝试将Rc<RefCell<Data>>转换为Rc<RefCell<dyn Interface>> (Data implements Interface),但在一般方法中是不可能的:

代码语言:javascript
复制
use std::cell::RefCell;
use std::rc::Rc;

trait Interface {
    fn pouet(&self);
}

struct Data {}

impl Interface for Data {
    fn pouet(&self) {
        println!("pouet");
    }
}

fn helper<T>(o: &Rc<RefCell<T>>)
where
    T: Interface,
{
    let t = o as &Rc<RefCell<dyn Interface>>;
    work(t);
}

fn work(o: &Rc<RefCell<dyn Interface>>) {
    o.borrow().pouet();
}

fn main() {
    // work
    {
        let o = Rc::new(RefCell::new(Data {}));
        work(&(o as Rc<RefCell<dyn Interface>>));
    }
    // raise an compile error
    {
        let o = Rc::new(RefCell::new(Data {}));
        helper(&o);
    }
}

我在非原始强制转换上有一个编译错误:

代码语言:javascript
复制
error[E0605]: non-primitive cast: `&Rc<RefCell<T>>` as `&Rc<RefCell<dyn Interface>>`
  --> src/main.rs:20:13
   |
20 |     let t = o as &Rc<RefCell<dyn Interface>>;
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object

游乐场

EN

回答 1

Stack Overflow用户

发布于 2020-12-30 14:50:26

非常感谢,我明白

解决办法是:

代码语言:javascript
复制
fn helper<T>(o: &Rc<RefCell<T>>)
where
    T: Interface + 'static,
{
    let t = o.clone() as Rc<RefCell<dyn Interface>>;
    work(&t);
}

代码语言:javascript
复制
fn helper<T>(o: Rc<RefCell<T>>)
where
    T: Interface + 'static,
{
    let t = o as Rc<RefCell<dyn Interface>>;
    work(&t);
}

谢谢

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65495270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档