[root@bogon option]# rm -rf target/ [root@bogon option]# cargo build Compiling own v0.1.0 (/data2/rust/option) Finished dev [unoptimized + debuginfo] target(s) in 0.47s [root@bogon option]# cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.01s Running `target/debug/own` 4 / 2 = 2 1 / 0 failed! Some(0.0) unwraps to 0.0 thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:38:49 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace [root@bogon option]#
选项 Option
有时候想要捕捉到程序某部分的失败信息,而不调用 panic!
;这可使用 Option
枚举来完成。
Option<T>
枚举有两个变量:
None
,表明失败或缺少值Some(value)
,元组结构体,使用T
类型装包了一个值value
// 不会 `panic!` 的整数除法。
fn checked_division(dividend: i32, divisor: i32) -> Option<i32> {
if divisor == 0 {
// 失败表示成 `None` 变量
None
} else {
// 结果 Result 被装包成 `Some` 变量
Some(dividend / divisor)
}
}
// 此函数处理可能失败的除法
fn try_division(dividend: i32, divisor: i32) {
// `Option` 值可以进行模式匹配,就和其他枚举一样
match checked_division(dividend, divisor) {
None => println!("{} / {} failed!", dividend, divisor),
Some(quotient) => {
println!("{} / {} = {}", dividend, divisor, quotient)
},
}
}
fn main() {
try_division(4, 2);
try_division(1, 0);
// 绑定 `None` 到一个变量需要类型标注
let none: Option<i32> = None;
let _equivalent_none = None::<i32>;
let optional_float = Some(0f32);
// 解包 `Some` 变量将展开解包后的值。
// (原文:Unwrapping a `Some` variant will extract the value wrapped.)
println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap());
// 解包 `None` 变量将会引发 `panic!`。
println!("{:?} unwraps to {:?}", none, none.unwrap());
}