5 个版本
0.1.4 | 2020 年 10 月 12 日 |
---|---|
0.1.3 | 2020 年 10 月 12 日 |
0.1.2 | 2020 年 10 月 12 日 |
0.1.1 | 2020 年 10 月 10 日 |
0.1.0 | 2020 年 10 月 10 日 |
#1622 在 Rust 模式
12KB
129 行
trait-union
这个包提供了一个宏,用于生成特质联合类型。也就是说,可以包含预先确定的一组实现者之一的特质对象类型。
生成的类型不分配内存。类型的大小是最大变体的大小加上一些常数开销。
注意:截至 rustc 1.47,必须启用 untagged_unions
功能才能在特质联合中存储非 Copy 类型。这将会很快改变。
示例
use trait_union::trait_union;
use std::fmt::Display;
trait_union! {
/// Container can contain either an i32, a &'static str, or a bool.
union Container: Display = i32 | &'static str | bool;
}
let mut container = Container::new(32);
assert_eq!(container.to_string(), "32");
container = Container::new("Hello World");
assert_eq!(container.to_string(), "Hello World");
container = Container::new(true);
assert_eq!(container.to_string(), "true");
实现
生成的类型大致如下
struct Container {
data: union {
variant1: i32,
variant2: &'static str,
variant3: bool,
},
vtable: *mut (),
}
因此,其大小类似于每个实现者一个变体的枚举的大小。根据实现者的数量,编译时间应该比枚举低得多。运行时性能类似于 Box<dyn Trait>
。
许可证
此项目可根据您的选择采用以下任一许可证
- Apache 许可证,版本 2.0
- MIT 许可证
。
依赖项
~1.5MB
~35K SLoC