// 什么是问号操作符?
// 参考: https://doc.rust-lang.org/book/second-edition/ch09-02-recoverable-errors-with-result.html
// 参考: https://stackoverflow.com/questions/42917566/what-is-this-question-mark-operator-about
// 由于Rust中没有Exception异常处理的语法,
// Rust只有panic报错, 并且panic不允许被保护, 因为没有提供 try 这种语法.
// Rust的异常处理是通过 Result 的 Ok 和 Err 成员来传递和包裹错误信息.
// 然而错误信息的处理一般都是要通过match来对类型进行比较, 所以很多时候
// 代码比较冗余, 通过?符号来简化Ok和Err的判断.
// 下面的例子提供了一个不使用?符号 以及 一个使用?符号的样例代码.
fn halves_if_even<'a >(i: i32) -> Result<i32, &'a str> { // 取数值的二分之一.
if i % 2 == 0 {
Ok(i/2)
} else {
Err("error")
}
}
fn not_use_question_mark() {
let a = 10; // 把这里改成 9 就会报错.
let half = halves_if_even(a);
let half = match half {
Ok(item) => item,
Err(e) => panic!(e),
};
assert_eq!(half, 5);
}
fn use_question_mark<'a >() -> Result<i32, &'a str> { // 这里必须要返回Result
let a = 10;
let half = halves_if_even(a)?; // 因为?要求其所在的函数必须要返回Result
assert_eq!(half, 5);
Ok(half)
}
fn main() {
not_use_question_mark();
let _ = use_question_mark();
}
rust--问号操作符
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 原文链接:Android RxJava操作符详解 系列:功能性操作符 Android RxJava:细说 线程控制...
- 赋值操作符(=) 复合赋值操作符 乘*= 除/= 模%= 加+= 减-= 左移<<= 有符号右移>>= 无符号右移...
- 莎士比亚说过,Rxjava的灵魂在于操作符。所以我打算写一个关于Rxjava的操作符实际应用系列,希望可以帮助大家...
- 具有更精确控制订阅动态的专业观察器。 首先我们有必要来了解一下什么是 Connectable Observable...