为什么编译器会警告一个未初始化的变量,即使我已经为该变量分配了每个字段?

Her*_*nán 2 initialization match rust

我正在完全分配匹配的每个可能大括号中MyStruct命名的实例的字段x:

enum MyEnum {
    One,
    Two,
    Three,
}

struct MyStruct {
    a: u32,
    b: u32,
}


fn main() {
    f(MyEnum::One);
    f(MyEnum::Two);
    f(MyEnum::Three);
}

fn f(y: MyEnum) -> MyStruct {
    let mut x: MyStruct;

    match y {
        MyEnum::One => {
            x.a = 1;
            x.b = 1;
        }
        MyEnum::Two => {
            x.a = 2;
            x.b = 2;
        }
        MyEnum::Three => {
            x.a = 3;
            x.b = 3;
        }
    }

    x
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器会返回以下错误?

error[E0381]: use of possibly uninitialized variable: `x`
  --> src/main.rs:37:5
   |
37 |     x
   |     ^ use of possibly uninitialized `x`
Run Code Online (Sandbox Code Playgroud)

我认为这是一个已知问题(另见相关问题).

red*_*ime 9

let x: MyStruct;没有设置x为空值,它声明了一个变量.您仍然需要为其分配值.

fn f(y: MyEnum) -> MyStruct {
    let x;

    match y {
        MyEnum::One => {
            x = MyStruct { a: 1, b: 1 };
        }
        MyEnum::Two => {
            x = MyStruct { a: 2, b: 2 };
        }
        MyEnum::Three => {
            x = MyStruct { a: 3, b: 3 };
        }
    }

    x
}
Run Code Online (Sandbox Code Playgroud)

换句话说,let x;创建一个未绑定的变量,一个没有与之关联的值的变量.因此,您需要稍后将一些值绑定到它.

如果您只想从函数返回一个值,您可以利用Rust中几乎每个语句都生成一个值的事实,并且最后一个语句的值是函数的返回值.

fn f(y: MyEnum) -> MyStruct {
    use MyEnum::*;

    let x = match y {
        One   => MyStruct { a: 1, b: 1 },
        Two   => MyStruct { a: 2, b: 2 },
        Three => MyStruct { a: 3, b: 3 },
    };
    x
}
Run Code Online (Sandbox Code Playgroud)

x如果您愿意,也可以完全消除.

fn f(y: MyEnum) -> MyStruct {
    use MyEnum::*;

    match y {
        One   => MyStruct { a: 1, b: 1 },
        Two   => MyStruct { a: 2, b: 2 },
        Three => MyStruct { a: 3, b: 3 },
    }
}
Run Code Online (Sandbox Code Playgroud)