哪些Rust 1.2容器支持特征对象?

时间:2019-07-04 22:21:25

标签: rust trait-objects

在Rust版指南中,它说在Rust 1.2中,more container types support trait objects。它给出了Rc<T>的示例,但是没有给出完整的列表。哪些其他容器支持Rust 1.2+中的特征对象?

1 个答案:

答案 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才能使其稳定。

其他用于特征对象的容器是BoxArcCell以及所有这些智能指针。

对特征对象不起作用的容器是VecHashMap,通常,这些容器可能存储一个以上的实例(集合)。这是因为相同特征对象的2个实例可能具有不同的大小(如果它们具有不同的具体类型),并且集合通常会连续存储元素,并需要一个恒定的大小。