这是一个关于 Rust dynamic cast trait object between different taits 的后续问题。当我们用引用来处理 trait 对象时,那里提供的解决方案非常有效,但是这一次我尝试使用
Rc
指针做同样的事情。例如:
- 我有一个名为
TraitAB
的超级 trait 和两个名为TraitA
和TraitB
的 trait。 - 因此,当我首次创建类型为
TraitAB
的 trait 对象时,不再使用Box
,而是使用Rc
指针。 - 我需要一个类型为
TraitA
的变量作为ab
的引用。
use std::rc::Rc;
trait TraitAB: TraitA + TraitB {
fn as_a(&self) -> Rc<dyn TraitA>;
fn as_b(&self) -> Rc<dyn TraitB>;
}
trait TraitA {}
trait TraitB {}
struct MyType {}
impl TraitAB for MyType {
fn as_a(&self) -> Rc<dyn TraitA> {
Rc::clone(self)
}
fn as_b(&self) -> Rc<dyn TraitB> {
Rc::clone(self)
}
}
impl TraitA for MyType {}
impl TraitB for MyType {}
fn main() {
let a: Rc<dyn TraitA>;
let b: Rc<dyn TraitB>;
{
let mut ab: Rc<dyn TraitAB> = Rc::new(MyType {});
a = ab.as_a();
b = ab.as_b();
}
}
但是这样做行不通。根据错误信息:
error[E0308]: mismatched types
--> src/main.rs:15:19
|
15 | Rc::clone(self)
| ^^^^ expected struct `std::rc::Rc`, found struct `MyType`
|
= note: expected reference `&std::rc::Rc<dyn TraitA>`
found reference `&MyType`
error[E0308]: mismatched types
--> src/main.rs:18:19
|
18 | Rc::clone(self)
| ^^^^ expected struct `std::rc::Rc`, found struct `MyType`
|
= note: expected reference `&std::rc::Rc<dyn TraitB>`
found reference `&MyType`
as_a
和as_b
无法知道自身实际上是一个Rc
指针。是否有一种方法可以对克隆的共享指针进行转换?
ab.clone().as_a()
是否等同于Rc::clone(&ab).as_a()
? - dospro