面试题答案
一键面试在Rust中,Result
类型用于处理函数可能出现的错误。Result
是一个枚举类型,有两个变体:Ok(T)
表示操作成功,其中T
是成功时返回的值;Err(E)
表示操作失败,其中E
是错误类型。
以下是一个返回Result
类型的函数示例:
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {
if b == 0 {
Err("除数不能为零")
} else {
Ok(a / b)
}
}
在这个函数中,如果b
为零,函数返回Err
变体,并带有错误信息;否则返回Ok
变体,带有除法运算的结果。
处理Result
类型的Ok
和Err
变体有多种方式:
- 使用
match
表达式:
fn main() {
let result1 = divide(10, 2);
let result2 = divide(10, 0);
match result1 {
Ok(value) => println!("结果: {}", value),
Err(error) => eprintln!("错误: {}", error),
}
match result2 {
Ok(value) => println!("结果: {}", value),
Err(error) => eprintln!("错误: {}", error),
}
}
- 使用
if let
表达式:
fn main() {
let result = divide(10, 2);
if let Ok(value) = result {
println!("结果: {}", value);
} else {
eprintln!("发生错误");
}
}
- 使用
unwrap
或expect
方法:unwrap
方法在Result
为Ok
时返回值,为Err
时会导致程序恐慌(panic)。expect
方法类似,但可以提供自定义的恐慌信息。
fn main() {
let result1 = divide(10, 2).unwrap();
let result2 = divide(10, 0).expect("除法操作失败");
}
在实际应用中,unwrap
和expect
应谨慎使用,通常在你确定操作不会失败时使用。
- 使用
?
操作符:?
操作符可以在函数中简洁地处理Result
类型的错误。如果Result
是Ok
,?
操作符返回其中的值;如果是Err
,则提前返回错误值给调用者。
fn perform_division() -> Result<i32, &'static str> {
let result1 = divide(10, 2)?;
let result2 = divide(result1, 5)?;
Ok(result2)
}
在这个函数中,如果divide
函数返回Err
,perform_division
函数会立即返回这个Err
,不再执行后续代码。