在 Rust 版本指南中,它说在 Rust 1.2 中,更多的容器类型支持 trait 对象。它给出了 的例子Rc<T>
,但没有给出完整的列表。还有哪些其他容器支持 Rust 1.2+ 中的 trait 对象?
问问题
194 次
1 回答
3
支持 trait 对象的容器是?Sized
对其容器类型有限制的容器。
默认情况下,使用泛型,所有类型都是Sized
隐式的,因为这是您大多数时候想要的,并且Sized
在几乎每个泛型上添加 a 会很烦人。这种行为与其他特征不同,可以通过添加?Sized
界限来避免。
struct Foo<T>; // implicit `T: Sized` bound. T cannot be a trait object.
struct Bat<T: ?Sized>; // T can be a trait object.
您可以在存储库中看到Rc
确实曾经被声明pub struct Rc<T>
并后来更改为pub struct Rc<T: ?Sized>
. GitHub 将此更改列为 Rust 1.1 的一部分,但我想我们必须等待 1.2 才能使其稳定。
其他适用于 trait 对象的容器是Box
,Arc
和Cell
所有类似的智能指针。
不适用于特征对象的容器是Vec
,HashMap
通常是可能存储多个实例(集合)的容器。这是因为相同特征对象的 2 个实例可能具有不同的大小(如果它们具有不同的具体类型),并且集合通常连续存储元素,需要恒定的大小。
于 2019-07-04T22:34:42.257 回答