我有以下定义:
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/