面试题答案
一键面试常见问题
- Panic风险:
unwrap
方法在Result
或Option
为Err
或None
时会导致程序panic
。例如:
let maybe_num: Option<i32> = None;
let num = maybe_num.unwrap(); // 这里会panic,因为maybe_num是None
- 隐藏错误信息:
unwrap
直接panic
,不会将错误信息返回给调用者进行处理,不利于上层代码对错误的处理和恢复。例如:
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {
if b == 0 {
Err("division by zero")
} else {
Ok(a / b)
}
}
let result = divide(10, 0).unwrap(); // 这里会panic,且调用者无法捕获具体错误信息
避免方法
- 使用
if let
或match
处理Option
:
let maybe_num: Option<i32> = Some(5);
if let Some(num) = maybe_num {
println!("The number is: {}", num);
} else {
println!("No number found");
}
- 使用
match
处理Result
:
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {
if b == 0 {
Err("division by zero")
} else {
Ok(a / b)
}
}
let result = divide(10, 2);
match result {
Ok(num) => println!("The result is: {}", num),
Err(e) => println!("Error: {}", e),
}
- 使用
unwrap_or
或unwrap_or_else
:unwrap_or
提供默认值:
let maybe_num: Option<i32> = None;
let num = maybe_num.unwrap_or(10);
println!("The number is: {}", num);
- `unwrap_or_else`提供根据错误生成默认值的逻辑:
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {
if b == 0 {
Err("division by zero")
} else {
Ok(a / b)
}
}
let result = divide(10, 0).unwrap_or_else(|_| {
println!("Caught an error, using default value");
0
});
println!("The result is: {}", result);
- 使用
expect
并提供自定义错误信息:
let maybe_num: Option<i32> = None;
let num = maybe_num.expect("Expected a number"); // 这里会panic并输出自定义错误信息
虽然expect
还是会panic
,但它提供了更有意义的错误信息,便于调试。不过在生产环境中,还是建议优先使用错误处理而不是panic
。