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日 |
#47 在 #union
用于 trait-union
11KB
228 行
trait-union
此crate提供了一个宏,用于生成trait-union类型。即可以包含预定义集合中任何实现者的trait对象类型。
生成的类型不进行分配。类型的大小是最大的变体大小加上一些常数开销。
注意:截至rustc 1.47,您必须启用untagged_unions
特性才能在trait-union中存储非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 (),
}
因此,其大小与每个实现者一个变体的enum
的大小相似。根据实现者的数量,编译时间应该比使用enum
低得多。运行时性能与Box<dyn Trait>
相似。
许可证
该项目受以下任一许可证的许可:
- Apache许可证,版本2.0
- MIT许可证
任选其一。
依赖关系
~1.5MB
~35K SLoC