?
运算符是 Rust 语言中的一个特性,它提供了一种简洁的方式来处理可能失败的运算。这个运算符只能用于返回 Result
或 Option
类型的函数,或者实现了 std::ops::Try
trait 的其他类型。
Ok(T)
表示成功并包含一个值,Err(E)
表示失败并包含一个错误。Some(T)
表示存在一个值,None
表示不存在值。Result
和 Option
都实现了这个 trait。?
运算符可以减少样板代码,使得错误处理更加直观和简洁。?
运算符清晰地表达了函数的意图,即它可能会失败并需要处理错误。?
运算符遇到 Err
或 None
,它会立即从当前函数返回错误,无需编写额外的 if-else 语句。Result<T, E>
: 表示一个操作可能成功并返回类型 T
的值,或者失败并返回类型 E
的错误。Option<T>
: 表示一个值可能存在(Some(T)
)或不存在(None
)。Result<File, io::Error>
。Result<Response, Error>
。Result<Rows, DbError>
。use std::fs::File;
use std::io::Read;
fn read_file_contents(path: &str) -> Result<String, std::io::Error> {
let mut file = File::open(path)?; // 如果打开文件失败,立即返回错误
let mut contents = String::new();
file.read_to_string(&mut contents)?; // 如果读取文件失败,立即返回错误
Ok(contents)
}
fn main() {
match read_file_contents("example.txt") {
Ok(contents) => println!("File contents: {}", contents),
Err(e) => eprintln!("Error reading file: {}", e),
}
}
如果你在使用 ?
运算符时遇到问题,可能是因为:
Result
或 Option
,并且错误类型与 ?
运算符后面的表达式兼容。?
运算符在一个不返回 Result
或 Option
的函数中使用,编译器会报错。你需要将函数的返回类型改为 Result
或 Option
。解决方法:
map_err
或 and_then
等方法来转换错误类型。例如,如果你有一个函数返回 Result<T, E1>
,但你需要将其转换为 Result<T, E2>
,你可以这样做:
fn convert_error(result: Result<T, E1>) -> Result<T, E2> {
result.map_err(|e1| E2::from(e1))
}
这样,你就可以在新的函数中使用 ?
运算符,而不用担心错误类型不匹配的问题。
领取专属 10元无门槛券
手把手带您无忧上云