当前位置:嗨网首页>书籍在线阅读

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一样。