【发布时间】:2018-08-05 04:04:02
【问题描述】:
我需要一个包含 trait 对象和更多自身的结构。令人失望的是以下代码无法编译:
trait Foo {}
struct Bar<T: Foo> {
bars: Vec<Box<Bar<dyn Foo>>>,
foo: T,
}
我设法通过将?Sized 添加到T 来强制编译,但我不明白为什么会这样。我认为这是因为所有 trait 对象都具有相同的大小,但 Bar 的大小取决于具体类型 T 的大小。如果是这样,Bar 和未调整大小的T 如何在内存中表示?具体来说是什么在堆上跟踪它的大小以及为什么不能在大小调整的情况下使用这种机制。
【问题讨论】:
-
在我看来,您会想要
Boxes 的Bars 而不是Bars 的Boxes。切换这些应该可以解决问题。 -
我考虑过这种方法,但
Box<dyn Foo>没有实现Foo。实际上Foo是一个更大的特征,并且为Box<dyn Foo>实现一切将是一件苦差事。一种选择是将 _T_/::new的边界切换为AsRef<dyn Foo>,这可行,但不是很整洁。 -
但是
Box<dyn Foo>没有实现Foo— so implement it...。 -
实际上
Foo是一个相当大的特征,实现它不仅是一件苦差事,而且感觉像是编译器应该能够处理的事情。
标签: compiler-errors rust traits typechecking