【问题标题】:Which Rust 1.2 containers support trait objects?哪些 Rust 1.2 容器支持 trait 对象?
【发布时间】: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


    【解决方案1】:

    支持 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&lt;T&gt;,后来被更改为pub struct Rc&lt;T: ?Sized&gt;。 GitHub 将此更改列为 Rust 1.1 的一部分,但我想我们必须等待 1.2 才能使其稳定。

    其他适用于 trait 对象的容器有 BoxArcCell 和所有类似的智能指针。

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

    【讨论】:

    • 这里可能值得具体说明“特征对象”的用法。我想大多数人会懒惰地将Box&lt;dyn Trait&gt; 称为“特征对象”,并且可以将其放入Vec
    猜你喜欢
    • 2021-05-10
    • 2010-12-18
    • 2017-05-27
    • 2011-06-25
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多