1 个不稳定版本
0.1.0 | 2024年2月9日 |
---|
#1004 在 数据结构
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));