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 日

#1622Rust 模式

MIT/Apache

12KB
129

trait-union

crates.io docs.rs

这个包提供了一个宏,用于生成特质联合类型。也就是说,可以包含预先确定的一组实现者之一的特质对象类型。

生成的类型不分配内存。类型的大小是最大变体的大小加上一些常数开销。

注意:截至 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