面试题答案
一键面试区别
- 语义不同:
Result<T, E>
用于表示操作可能成功或失败的情况。T
代表成功时返回的值类型,E
代表失败时返回的错误类型。它适用于那些明确可能出现错误,且需要区分不同错误类型的操作。Option<T>
用于表示值可能存在或不存在的情况。T
代表可能存在的值类型。它主要用于处理值的存在性问题,比如空指针、空集合中的元素等,并不关心失败的原因。
- 错误处理粒度:
Result<T, E>
能提供更细粒度的错误处理,因为E
可以是自定义的错误类型,包含具体的错误信息。Option<T>
仅简单表明值是否存在,没有具体的错误原因。
应用场景
- Result<T, E>:
- 适用于文件操作、网络请求等可能出现多种错误类型的场景。例如,打开文件可能因为文件不存在、权限不足等不同原因失败,这些不同原因可以通过不同的
E
类型表示。
- 适用于文件操作、网络请求等可能出现多种错误类型的场景。例如,打开文件可能因为文件不存在、权限不足等不同原因失败,这些不同原因可以通过不同的
- Option:
- 适用于处理可能为空的返回值,比如在集合中查找元素,元素可能不存在。
实际代码示例
- 使用 Result<T, E> 进行错误处理:
use std::fs::File;
use std::io::Error;
fn read_file() -> Result<String, Error> {
let file = File::open("example.txt")?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
fn main() {
match read_file() {
Ok(contents) => println!("File contents: {}", contents),
Err(e) => println!("Error reading file: {}", e),
}
}
在上述代码中,read_file
函数返回 Result<String, Error>
,File::open
和 read_to_string
操作都可能失败并返回 io::Error
,使用 ?
操作符简洁地处理错误。
2. 使用 Option 进行错误处理:
fn find_number_in_vec(vec: &[i32], target: i32) -> Option<&i32> {
vec.iter().find(|&&num| num == target)
}
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
match find_number_in_vec(&numbers, 3) {
Some(number) => println!("Found number: {}", number),
None => println!("Number not found"),
}
}
在这个例子中,find_number_in_vec
函数返回 Option<&i32>
,表示目标数字在向量中可能存在(Some
)或不存在(None
)。