rust - 在子类型上获取 Rc<RefCell<dyn T>>>

标签 rust subtyping trait-objects

我有以下定义:

trait A {
    fn f(&self);
}

trait B: A {
// ...
}
我想实现这种功能:
fn convert(v: Rc<RefCell<dyn B>>) -> Rc<RefCell<dyn A>> {
}
我想有一种方法来返回共享相同对象的值,这意味着使用这些声明:
let x: Rc<RefCell<dyn B>> /* = ... */;
let y = convert(Rc::clone(&x));
电话x.f()y.f()在同一个对象上应用调用。
如何实现功能convert或者如何更改类型定义以具有该行为和那种转换(转换为子对象)。

最佳答案

Rust 不支持直接向上转换 trait 对象。由于 trait 对象的实现方式,如果在运行时没有额外的工作,这是不可能的,所以 Rust 让你自己做这些工作。
你可以这样做,例如

use std::rc::Rc;
use std::cell::RefCell;

trait A {
  fn f(&self) -> i32;
}

trait B: A {
}

struct Wrapper(Rc<RefCell<dyn B>>);

impl A for Wrapper {
    fn f(&self) -> i32 {
        A::f(&*self.0.borrow())
    }
}

fn convert(v: Rc<RefCell<dyn B>>) -> Rc<RefCell<dyn A>> {
    Rc::new(RefCell::new(Wrapper(v)))
}

关于rust - 在子类型上获取 Rc<RefCell<dyn T>>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64396632/

相关文章:

rust - 子类型和方差(&mut 不变)违反 Rust 中的错误

scala - 隐式搜索不指导类型推断在 Scala 中查找父类(super class)型

generics - 是否可以(以任何方式)将特征对象传递给通用方法?

rust - 如何在WebAssembly中返回对嵌套Rust结构的引用?

rust - 链接 self 的生命周期和方法中的引用

rust - 标准是否定义了 Result<T, dyn std::error::Error> 的别名?

c - 在 C 程序中嵌入 Rust 任务?

types - 通配符模式覆盖多态变体的子类型约束

rust - 为什么 rustc 的建议在这里是错误的?

rust - 为什么不能将&str传递给接受&dyn Display特征对象的函数?