"possibly uninitialized variable" 在 `match` 中初始化时
"possibly uninitialized variable" when it is initialized inside `match`
此代码(playground):
fn main() {
let fruits = "banana";
let num = 20;
let result: i32;
match fruits {
"banana" => {
if num > 100 {
result = num * 3;
} else if num > 30 {
result = num * 4;
} else {
result = num * 5;
}
}
"apple" => {
if num > 100 {
result = num * 16;
} else if num > 30 {
result = num * 18;
} else {
result = num * 20;
}
}
_ => println!("wrong fruits option"),
}
// if num > 100 { result = num * 3; }
// else if num > 30 { result = num * 4; }
// else { result = num * 5;}
println!("{}", result)
}
出现以下错误:
error[E0381]: borrow of possibly-uninitialized variable: `result`
--> src/main.rs:31:20
|
31 | println!("{}", result)
| ^^^^^^ use of possibly-uninitialized `result`
|
= note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
如您所见,result
已在匹配中初始化,那么为什么编译器会给我一个错误?
改线后
let result : i32;
至 (playground)
let mut result = 0;
代码正在编译并且工作正常。
这也有效 (playground):
fn main() {
// let fruits = "banana";
let num = 20;
let result: i32;
// match fruits {
// "banana" => {
// if num > 100 {
// result = num * 3;
// } else if num > 30 {
// result = num * 4;
// } else {
// result = num * 5;
// }
// }
// "apple" => {
// if num > 100 {
// result = num * 16;
// } else if num > 30 {
// result = num * 18;
// } else {
// result = num * 20;
// }
// }
// _ => println!("wrong fruits option"),
// }
if num > 100 {
result = num * 3;
} else if num > 30 {
result = num * 4;
} else {
result = num * 5;
}
println!("{}", result)
}
result
可能未初始化的原因是_
案例没有初始化result
.
但是,我不认为你的意图是在那种情况下初始化result
。这里真正的错误可能是您可能希望 _
案例成为停止执行的错误案例。但是,您没有告诉它停止执行。
有多种方法可以解决这个问题:
- 在
_
案例中添加 return
或 exit
语句
- 将
println
替换为 panic
- 通过向 main 添加
Result
return 值然后 return 错误来引入正确的错误处理。
我决定使用 panic
以最少的努力。请注意,在生产中,恐慌应该是最后的解决方案。使用 Result
和 Error
的正确错误处理始终是首选。
所以这是我为使其工作而进行的最小修改:
fn main() {
let fruits = "banana";
let num = 20;
let result: i32;
match fruits {
"banana" => {
if num > 100 {
result = num * 3;
} else if num > 30 {
result = num * 4;
} else {
result = num * 5;
}
}
"apple" => {
if num > 100 {
result = num * 16;
} else if num > 30 {
result = num * 18;
} else {
result = num * 20;
}
}
_ => panic!("wrong fruits option"),
}
// if num > 100 { result = num * 3; }
// else if num > 30 { result = num * 4; }
// else { result = num * 5;}
println!("{}", result)
}
此代码(playground):
fn main() {
let fruits = "banana";
let num = 20;
let result: i32;
match fruits {
"banana" => {
if num > 100 {
result = num * 3;
} else if num > 30 {
result = num * 4;
} else {
result = num * 5;
}
}
"apple" => {
if num > 100 {
result = num * 16;
} else if num > 30 {
result = num * 18;
} else {
result = num * 20;
}
}
_ => println!("wrong fruits option"),
}
// if num > 100 { result = num * 3; }
// else if num > 30 { result = num * 4; }
// else { result = num * 5;}
println!("{}", result)
}
出现以下错误:
error[E0381]: borrow of possibly-uninitialized variable: `result`
--> src/main.rs:31:20
|
31 | println!("{}", result)
| ^^^^^^ use of possibly-uninitialized `result`
|
= note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
如您所见,result
已在匹配中初始化,那么为什么编译器会给我一个错误?
改线后
let result : i32;
至 (playground)
let mut result = 0;
代码正在编译并且工作正常。
这也有效 (playground):
fn main() {
// let fruits = "banana";
let num = 20;
let result: i32;
// match fruits {
// "banana" => {
// if num > 100 {
// result = num * 3;
// } else if num > 30 {
// result = num * 4;
// } else {
// result = num * 5;
// }
// }
// "apple" => {
// if num > 100 {
// result = num * 16;
// } else if num > 30 {
// result = num * 18;
// } else {
// result = num * 20;
// }
// }
// _ => println!("wrong fruits option"),
// }
if num > 100 {
result = num * 3;
} else if num > 30 {
result = num * 4;
} else {
result = num * 5;
}
println!("{}", result)
}
result
可能未初始化的原因是_
案例没有初始化result
.
但是,我不认为你的意图是在那种情况下初始化result
。这里真正的错误可能是您可能希望 _
案例成为停止执行的错误案例。但是,您没有告诉它停止执行。
有多种方法可以解决这个问题:
- 在
_
案例中添加return
或exit
语句 - 将
println
替换为panic
- 通过向 main 添加
Result
return 值然后 return 错误来引入正确的错误处理。
我决定使用 panic
以最少的努力。请注意,在生产中,恐慌应该是最后的解决方案。使用 Result
和 Error
的正确错误处理始终是首选。
所以这是我为使其工作而进行的最小修改:
fn main() {
let fruits = "banana";
let num = 20;
let result: i32;
match fruits {
"banana" => {
if num > 100 {
result = num * 3;
} else if num > 30 {
result = num * 4;
} else {
result = num * 5;
}
}
"apple" => {
if num > 100 {
result = num * 16;
} else if num > 30 {
result = num * 18;
} else {
result = num * 20;
}
}
_ => panic!("wrong fruits option"),
}
// if num > 100 { result = num * 3; }
// else if num > 30 { result = num * 4; }
// else { result = num * 5;}
println!("{}", result)
}