【发布时间】:2019-07-04 22:21:25
【问题描述】:
在 Rust 版本指南中它说在 Rust 1.2 中,more container types support trait objects。它给出了Rc<T> 的例子,但没有给出完整的列表。还有哪些其他容器支持 Rust 1.2+ 中的 trait 对象?
【问题讨论】:
标签: rust trait-objects
在 Rust 版本指南中它说在 Rust 1.2 中,more container types support trait objects。它给出了Rc<T> 的例子,但没有给出完整的列表。还有哪些其他容器支持 Rust 1.2+ 中的 trait 对象?
【问题讨论】:
标签: rust trait-objects
支持 trait 对象的容器是在其容器类型上绑定了 ?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 才能使其稳定。
其他适用于 trait 对象的容器有 Box、Arc、Cell 和所有类似的智能指针。
不适用于特征对象的容器是Vec、HashMap,通常是可能存储多个实例(集合)的容器。这是因为相同 trait 对象的 2 个实例可能具有不同的大小(如果它们具有不同的具体类型),并且集合通常连续存储元素,需要一个恒定的大小。
【讨论】:
Box<dyn Trait> 称为“特征对象”,并且可以将其放入Vec。