27-联合
7.5.4 联合
为了与C代码交互操作,Rust还提供了联合类型,它直接映射了C语言的union。联合的读取操作是不安全的。接下来让我们看看如何创建它,并与之交互:
// unions.rs
#[repr(C)]
union Metric {
rounded: u32,
precise: f32,
}
fn main() {
let mut a = Metric { rounded: 323 };
unsafe {
println!("{}", a.rounded);
}
unsafe {
println!("{}", a.precise);
}
a.precise = 33.3;
unsafe {
println!("{}", a.precise);
}
}
我们创建了一个联合类型Metric,它有两个字段rounded和precise,用于表示一些测量指标。在main中,我们用变量a接收它初始化后的实例。
我们只能初始化其中的一个变量,否则编译器将提示以下错误提示信息:
error: union expressions should have exactly one field
--> unions.rs:10:17
|
10 | let mut a = Metric { rounded: 323, precise:23.0 };
我们还必须使用unsafe代码块来输出联合中的字段。编译并运行上述代码,输出结果如下:
323
0.000000000000000000000000000000000000000000453
33.3
如你所见,我们得到了未初始化字段precise的垃圾值。在撰写本书时,联合仅允许Copy类型作为其字段。它们与所有字段共享相同的内存空间,就像C语言的union一样。