1

在 Rust 版本指南中,它说在 Rust 1.2 中,更多的容器类型支持 trait 对象。它给出了 的例子Rc<T>,但没有给出完整的列表。还有哪些其他容器支持 Rust 1.2+ 中的 trait 对象?

4

1 回答 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,ArcCell所有类似的智能指针。

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

于 2019-07-04T22:34:42.257 回答