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)
我认为这是一个已知问题(另见相关问题).
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)
| 归档时间: |
|
| 查看次数: |
578 次 |
| 最近记录: |