【发布时间】:2019-04-30 19:45:41
【问题描述】:
这是来自Rust dynamic cast trait object between different taits 的后续问题。当我们使用 trait 对象的引用时,那里提供的解决方案非常有效,但这次我尝试对 Rc 指针做同样的事情。例如
- 我有一个名为
TraitAB的超级特征和两个名为TraitA和TraitB的特征 - 所以当我第一次创建
TraitAB类型的特征对象而不是使用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 无法知道 self 实际上是一个 Rc 指针。
有没有办法对克隆的共享指针进行强制转换?
【问题讨论】:
标签: casting rust smart-pointers trait-objects