获取子类型上的 Rc<RefCell<dyn T>>>

Cor*_*ker 5 rust subtyping trait-objects

我有以下定义:

trait A {
    fn f(&self);
}

trait B: A {
// ...
}
Run Code Online (Sandbox Code Playgroud)

我想实现这样的功能:

fn convert(v: Rc<RefCell<dyn B>>) -> Rc<RefCell<dyn A>> {
}
Run Code Online (Sandbox Code Playgroud)

我想要一种方法来返回共享同一对象的值,这意味着使用这些声明:

let x: Rc<RefCell<dyn B>> /* = ... */;
let y = convert(Rc::clone(&x));
Run Code Online (Sandbox Code Playgroud)

调用x.f()y.f()应用调用位于同一对象上。

我如何实现该函数convert或如何更改类型定义以具有该行为和该类型的转换(到子对象的转换)。

Cor*_*ker 0

convert感谢您的想法,我决定采用折衷方案,根据 Rust 规则避免使用特征对象作为函数的参数:

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

trait A {
    fn print(&self);
}

trait B: A {
}

trait Convert {
    fn convert(it: Rc<RefCell<Self>>) -> Rc<RefCell<dyn A>>;
}

struct MyType(u32);

impl Convert for MyType {
    fn convert(it: Rc<RefCell<Self>>) -> Rc<RefCell<dyn A>> {it}
}

impl A for MyType {
    fn print(&self) {
        println!("MyType({}) as A", self.0);
    }
}

impl B for MyType {}

fn main() {
    let a: Rc<RefCell<dyn A>>;
    {
        let b = Rc::new(RefCell::new(MyType(3)));
        a = Convert::convert(b.clone());
    }

    a.borrow().print();
}
Run Code Online (Sandbox Code Playgroud)

操场