Rust声称这种模式无法实现,为什么呢?

时间:2019-04-26 11:46:03

标签: rust union

给出此代码

union IntOrFloat {
    i: i32,
    f: f32,
}

fn process_value(iof: IntOrFloat) {
    unsafe {
        match iof {
            IntOrFloat { i: 42 } => {
                println!("meaning of life value");
            }
            IntOrFloat { i } => {
                println!("integer with value {}", i);
            }
            IntOrFloat { f } => {
                println!("f32 = {}", f);
            }
        }
    }
}

Rust给我以下警告:

warning: unreachable pattern
   --> src\main.rs:445:13
    |
445 |             IntOrFloat { f } => {
    |             ^^^^^^^^^^^^^^^^
    |
    = note: #[warn(unreachable_patterns)] on by default

我为什么要得到这个?显然,i的情况为i32f的情况为f32,两者都是可能的。

更新:CLion同意我的观点

CLion inference of union cases

1 个答案:

答案 0 :(得分:1)

来自rust reference

  

访问联合字段的另一种方法是使用模式匹配。联合字段上的模式匹配使用与结构模式相同的语法,不同之处在于模式必须恰好指定一个字段

所以不,工会不能像这样匹配。外部文档(或来源)是确定应使用哪个联合字段的唯一方法。这就是为什么它被标记为不安全