union:一个非安全的 enum

Rust 现在支持 unions:
1. union MyUnion {
2. f1: u32,
3. f2: f32,
4. }
Unions 是一种如同 enums 的结构,但是,它没有标签。 Enums 是带有 “标签” 的,用来存储哪个变种在运行时,正在被使用。unions并没有这个。
由于我们可以使用错误的变体解释 union 中保存的数据,并且 Rust 无法为 我们检查这一点,这意味着读取或写入 union 字段是不安全的:
1. # union MyUnion {
2. # f1: u32,
3. # f2: f32,
4. # }
5. let mut u = MyUnion { f1: 1 };
7. unsafe { u.f1 = 5 };
9. let value = unsafe { u.f1 };
模式匹配也一样工作:
1. # union MyUnion {
2. # f1: u32,
3. # f2: f32,
4. # }
5. fn f(u: MyUnion) {
6. unsafe {
7. match u {
8. MyUnion { f1: 10 } => { println!("ten"); }
9. MyUnion { f2 } => { println!("{}", f2); }
10. }
11. }
12. }
unions 什么时候有用? 一个主要的用例是与 C 的互操作性。 C API 可以(并且取决于区域,经常这样做)公开 unions, 因此这使得为这些库编写 API 包装器变得非常容易。 此外,unions 还简化了依赖于值表示的 节省空间或高效缓存的结构的 Rust 实现,例如使用对齐指针的最低有效位来区分情况的机器字大小的 unions。
还有更多改进。 目前,unions 只能包含 Copy 类型,可能不会实现 Drop。 我们希望将来能够解除这些限制。
