微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在子类型

如何解决在子类型

我有以下定义:

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不支持特征对象的直接向上转换。由于特质对象的实现方式,没有运行时的额外工作是不可能的,因此Rust使您自己完成工作。

您可以像这样

"source node name","destination node name","application name","reason","interface number","channel number allocated"
,

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

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();
}

Playground

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。