【发布时间】:2021-04-01 09:25:01
【问题描述】:
我无法理解以下错误:
// test.rs
struct A {
a: u32
}
trait B { }
impl B for A { }
struct C {
c: Vec<Box<dyn B>>,
}
fn test() {
let a = A {a: 1};
let a_vec = vec![Box::new(a)];
let c = C {
c: a_vec,
// c: vec![Box::new(a)],
};
}
编译错误:
mismatched types
expected trait object `dyn test::B`, found struct `test::A`
错误发生在我尝试创建 C 的那一行。有趣的是,如果我按以下方式创建 C,那么它可以正常编译。
let c = C {
c: vec![Box::new(a)],
};
另一种可行的方法是
let a_vec: Vec<Box<dyn B>> = vec![Box::new(a)];
let c = C {
c: a_vec,
};
我做的另一个实验是将 C.c 的类型更改为 Box 而不是 Vec
在我看来,这可能是 Rust 关于特征对象向量的类型推断的一些缺失功能/错误?我对 Rust 还是很陌生,所以对此的任何想法都非常感谢!
【问题讨论】:
-
另一个有效的变体是
vec![Box::new(a) as _]。错误本身是由于瘦指针(盒装具体结构)和胖指针(盒装 dyn 特征)之间的差异造成的。一个可以转换为另一个(假设结构实现了特征),但有时编译器需要一些轻推来执行转换。这是类型推断的缺陷还是某些更深层次原理的结果,这是一个很好的问题。
标签: rust trait-objects