在 Rust 版本指南中,它说在 Rust 1.2 中,more container types support trait objects .它给出了 Rc<T>
的例子,但它没有给出完整的列表。还有哪些其他容器支持 Rust 1.2+ 中的特征对象?
最佳答案
支持特征对象的容器是在其容器类型上绑定(bind)了 ?Sized
的容器。
默认情况下,对于泛型,所有类型都是隐式的 Sized
,因为这是您大多数时候想要的,并且在几乎每个泛型上添加 Sized
会很烦人。这种行为不同于其他特征,可以通过添加 ?Sized
绑定(bind)来避免。
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 才能使其稳定。
其他适用于 trait 对象的容器是 Box
、 Arc
、 Cell
以及所有类似的智能指针。
不适用于特征对象的容器是 Vec
、 HashMap
和通常可以存储多个实例(集合)的容器。这是因为相同特征对象的 2 个实例可能具有不同的大小(如果它们具有不同的具体类型),并且集合通常连续存储元素,需要恒定的大小。
关于rust - 哪些 Rust 1.2 容器支持特征对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56894710/