1 个不稳定版本

0.1.0 2024年2月9日

#1004数据结构

MIT/Apache

14KB
63

VBox

VBox 是存储 vtable 指针的类型擦除 trait 对象 Box。

VBox 就像 Box<dyn Trait>,但擦除了 Trait 类型,因此在使用它时,不需要将 Trait 作为其类型参数之一。只有创建者和消费者需要就类型参数达成一致。

内部,它将 trait 对象的数据指针存储在一个 Box<dyn Any + Send> 中,以便在包装器被丢弃时调用 Drop::drop()。并且它将 vtable 指针存储在另一个 usize 中,以确保它是 Send

示例

// Pack a u64 into a `Debug` trait object and erase the type `Debug`.
let vbox: VBox = into_vbox!(dyn Debug, 10u64);

// Unpack to different trait object will panic:
// let _panic = from_vbox!(dyn Display, vbox);

// Unpack the `Debug` trait object.
let unpacked: Box<dyn Debug> = from_vbox!(dyn Debug, vbox);

assert_eq!("10", format!("{:?}", unpacked));

lib.rs:

VBox 是存储 vtable 指针的类型擦除 trait 对象 Box。

VBox 就像 Box<dyn Trait>,但擦除了 Trait 类型,因此在使用它时,不需要将 Trait 作为其类型参数之一。只有创建者和消费者需要就类型参数达成一致。

内部,它将 trait 对象的数据指针存储在一个 Box<dyn Any + Send> 中,以便在包装器被丢弃时调用 Drop::drop()。并且它将 vtable 指针存储在另一个 usize 中,以确保它是 Send

示例

// Pack a u64 into a `Debug` trait object and erase the type `Debug`.
let vbox: VBox = into_vbox!(dyn Debug, 10u64);

// Unpack to different trait object will panic:
// let _panic = from_vbox!(dyn Display, vbox);

// Unpack the `Debug` trait object.
let unpacked: Box<dyn Debug> = from_vbox!(dyn Debug, vbox);

assert_eq!("10", format!("{:?}", unpacked));

无运行时依赖