【发布时间】:2019-08-07 11:48:32
【问题描述】:
我有一个特征和一个实现该特征的结构(一个特征对象)。我想在堆上分配我的特征对象并让其他结构引用它们。
框字段
trait Material {}
struct Iron {}
impl Material for Iron {}
// It works, but takes ownership of boxes.
struct Sphere {
radius: f64,
material: Box<dyn Material>,
}
此代码有效,但我不能让两个球体共享同一个Material,因为Box 拥有材料,而球体拥有其Box 字段。
参考字段
我的下一个尝试是使用普通引用而不是 Box:
struct Sphere<'a> {
radius: f64,
material: &'a dyn Material,
}
这也有效,但据我了解,我的Materials 将分配在堆栈而不是堆上。如果Material 值真的很大而且我宁愿把它放在堆上怎么办?这导致我采用下一种无法编译的方法:
对框的引用
struct Sphere<'a> {
radius: f64,
material: &'a Box<dyn Material>,
}
fn main() {
let m1 = &Box::new(Iron {});
let s1 = Sphere {
radius: 1.0,
material: m1,
};
assert_eq!(s1.radius, 1.0);
}
这给了我以下错误:
error[E0308]: mismatched types
--> src/main.rs:16:19
|
16 | material: m1,
| ^^ expected trait Material, found struct `Iron`
|
= note: expected type `&std::boxed::Box<(dyn Material + 'static)>`
found type `&std::boxed::Box<Iron>`
我不太确定 'static 在该类型中来自哪里,看起来它混淆了类型检查器。否则dyn Material 和Iron 可以统一,据我所知。
【问题讨论】:
标签: rust traits trait-objects