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

标签 rust trait-objects

在 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 对象的容器是 BoxArcCell 以及所有类似的智能指针。

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

关于rust - 哪些 Rust 1.2 容器支持特征对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56894710/

相关文章:

memory - 如何将拥有的盒子发送给子任务?

rust - 在带有 rust 的向量中实现特征的问题

generics - Rust说,即使设置了适当的生命周期,功能参数的生命周期也不够

vector - 为什么我不能借用盒装矢量内容作为可变内容?

rust - 如何包装对在 Rust 中使用 VarArgs 的 FFI 函数的调用?

rust - 为什么我可以遍历一个切片两次,而不是一个向量?

rust - 如何将结构的 Vec 强制转换为特征对象的 Vec?

rust - 有没有办法确定 VTable 中每个特征方法的偏移量?

generics - 为什么 `&(?Sized + Trait)`无法转换为 `&dyn Trait`?