在Rust版指南中,它说在Rust 1.2中,more container types support trait objects。它给出了Rc<T>
的示例,但是没有给出完整的列表。哪些其他容器支持Rust 1.2+中的特征对象?
答案 0 :(得分:3)
支持特征对象的容器是在其容器类型上绑定了?Sized
的容器。
默认情况下,泛型默认情况下,所有类型都是Sized
隐式的,因为这通常是您想要的,并且几乎在每个泛型上都添加Sized
会很烦人。此行为与其他特征不同,可以通过添加?Sized
绑定来避免。
struct Foo<T>; // implicit `T: Sized` bound. T cannot be a trait object.
struct Bat<T: ?Sized>; // T can be a trait object.
您可以see on the repository Rc
确实曾经被声明为pub struct Rc<T>
,后来又更改为pub struct Rc<T: ?Sized>
。 GitHub将此更改列为Rust 1.1的一部分,但我想我们必须等待1.2才能使其稳定。
其他用于特征对象的容器是Box
,Arc
,Cell
以及所有这些智能指针。
对特征对象不起作用的容器是Vec
,HashMap
,通常,这些容器可能存储一个以上的实例(集合)。这是因为相同特征对象的2个实例可能具有不同的大小(如果它们具有不同的具体类型),并且集合通常会连续存储元素,并需要一个恒定的大小。