如何创建实现大小特征的单元结构的 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 对象的操作都是必需的。
我希望能够创建一个实现大小特征的单元结构的 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 对象的操作都是必需的。