Warum warnt der Compiler vor einer nicht initialisierten Variablen, obwohl ich jedes Feld dieser Variablen zugewiesen habe?
Ich ordne die Felder der MyStruct
Instanz, die x
in jeder möglichen Klammer der Übereinstimmung genannt werden, vollständig zu :
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
}
Warum gibt der Compiler den folgenden Fehler zurück?
error[E0381]: use of possibly uninitialized variable: `x`
--> src/main.rs:37:5
|
37 | x
| ^ use of possibly uninitialized `x`
Ich denke, dies ist ein bekanntes Problem (siehe auch das zugehörige Problem).
let x: MyStruct;
setzt keinen x
leeren Wert, sondern deklariert eine Variable. Sie müssen ihm noch einen Wert zuweisen.
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
}
Mit anderen Worten, let x;
erstellt eine ungebundene Variable, eine Variable, der kein Wert zugeordnet ist. Daher müssen Sie später einen Wert daran binden.
Wenn Sie nur einen Wert von der Funktion zurückgeben möchten, können Sie die Tatsache nutzen, dass fast jede Anweisung in Rust einen Wert erzeugt und ein Wert der letzten Anweisung der Rückgabewert einer Funktion ist.
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
}
Sie können auch vollständig eliminieren x
, wenn Sie dies wünschen.
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 },
}
}