Option 与 Result
Rust 不鼓励你用空指针和异常表达普通失败。它用 Option<T> 表示“可能没有值”,用 Result<T, E> 表示“可能失败”。
Option
let value: Option<i32> = Some(10);
let empty: Option<i32> = None;
处理 Option:
src/main.rs
fn main() {
let value = Some(10);
match value {
Some(n) => println!("{n}"),
None => println!("no value"),
}
}
Result
解析字符串为数字会返回 Result:
src/main.rs
fn main() {
let result = "42".parse::<i32>();
match result {
Ok(n) => println!("{n}"),
Err(e) => println!("parse error: {e}"),
}
}
unwrap 和 expect
unwrap() 会在失败时 panic:
let n = "42".parse::<i32>().unwrap();
expect() 可以提供更清楚的错误信息:
let n = "42".parse::<i32>().expect("not a number");
初学示例中可以使用它们,但正式程序应优先处理错误。
? 运算符
? 可以把错误向上传播:
use std::fs;
use std::io;
fn read_config() -> io::Result<String> {
let content = fs::read_to_string("config.txt")?;
Ok(content)
}
如果读取失败,函数会直接返回错误;成功时取出里面的值。
小结
你需要掌握:
Option<T>表示有值或没有值。Result<T, E>表示成功或失败。match能完整处理所有分支。unwrap()和expect()会在失败时 panic。?用于传播错误。