如何创建实现大小特征的单元结构的 Vec?

How to create a Vec of unit structs that implement sized trait?

我希望能够创建一个实现大小特征的单元结构的 Vec(最好不使用 Box<T>)。

这是我想要做的,但它失败了,并说 ProgrammingLanguage 不能成为特征对象:

struct Python;
struct Rust;

trait ProgrammingLanguage: Sized {
    fn say_hello_world() -> ();
}

impl ProgrammingLanguage for Python {...}
impl ProgrammingLanguage for Rust {...}

// Fails because ProgrammingLanguage cannot be made into a trait object
let foo = Vec::<ProgrammingLanguage>::from([Python, Rust]);

Sized 特性在这里对您没有帮助。它所能保证的是 任何特定的 特征实现是大小的,即你不能在 [u8]dyn OtherTrait 上实现它;但根据定义,dyn ProgrammingLanguage 本身始终未调整大小。原因很简单:trait 对象的大小被定义为原始类型的大小,并且无法静态地保证每个实现该 trait 的类型都具有相同的大小。

然而,没有真正的理由避免 Box。正如评论中提到的,Box<UnitStruct> 本质上只是一个从未取消引用的悬挂指针,根本没有任何分配:

struct Rust;

fn main() {
    println!("{:p}", Box::new(Rust)); // prints `0x1`
}

当您将其转换为 trait 对象时,指针本身不会改变 - 编译器只是添加 vtable 指针,这对于任何对 trait 对象的操作都是必需的。