#traits #union #object #variant #trait-union

macro trait-union-proc

trait-union包的内部依赖

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

MIT/Apache

11KB
228

trait-union

crates.io docs.rs

此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