在子类型上获取 Rc<RefCell<dyn T>>>
Get Rc<RefCell<dyn T>>> on a sub-type
我有以下定义:
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 对象的实现方式,如果不在运行时进行额外工作,这是不可能的,因此 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 规则通过避免使用 trait-object 作为函数 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();
}
我有以下定义:
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 对象的实现方式,如果不在运行时进行额外工作,这是不可能的,因此 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 规则通过避免使用 trait-object 作为函数 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();
}