Rust问号?操作符: the `?` operator can only be used in a function that returns `Result` or `Option`

内容节选自专栏文章:Rust 11:错误处理(Option<T>、Result<T,E>、panic、catch_unwind)


Rust编程中主要通过Option<T>Result<T,E>来传播和处理各种错误。

?操作符

为了让Result<T,E>类型的处理更加方便简洁,Rust中引入了?操作符。
问号操作符是针对Result<T,E>类型的一个语法糖,?操作符内部被展开成一段类似如下match匹配的代码:

match result {
  Ok(v) => v,
  Err(e) => return Err(e.into())
}
  • 如果Result是一个E类型的错误值,则提前返回错误,结束当前函数。
  • 如果Result是一个T类型的正确值,则提取出值,方便后续进行链式调用。

所以,?操作符可以方便地对Result<T,E>进行值提取(Ok(v) => v),或者返回一个错误类型值,提前结束当前函数。

代码测试

先来定义一个自己的错误类型:

struct MyError {
    code: i32, 
    msg: String
}
use std::fmt::{Display,Debug,Formatter};
impl std::error::Error for MyError { }
impl Debug for MyError {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "[{}]{}", self.code, self.msg)
    }
}
impl Display for MyError {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "[{}]{}", self.code, self.msg)
    }
}

main()函数中测试:

fn main() -> Result<(), MyError> {
    let oneError: Result<(), MyError>= Err(MyError{
        code: -1,
        msg: "error".to_owned(),
    });
    // 问号操作符是针对Result<T,E>类型的一个语法糖
    // 本质是一个match匹配
    // 如果Result是一个E类型的错误值,则提前返回错误,结束当前函数
    // 如果Result是一个T类型的正确值,则提取出值,方便后续进行链式调用
    oneError?;

    Ok(())
}

限制!!

/// the `?` operator can only be used in a function that returns `Result`
/// or `Option` (or another type that implements `FromResidual`)
  1. ?操作符只能使用在以Option或者Result作为返回值的函数体中
  2. 如果要在main()中使用?操作符。那么首先是要求main()返回值是Option或者Result类型(满足第一条);其次,还要求返回值是要实现std::process::Termination trait的类型。
    rust文档:Termination
pub trait Termination {
    fn report(self) -> i32;
}

其中report()方法返回一个i32值,这与C语言中main()函数要求返回一个整数值一致。

测试代码中的Result<(), MyError>可以作为main函数的返回值类型,是因为标准库中有如下实现:

impl<E: fmt::Debug> Termination for Result<(), E> {
    fn report(self) -> i32 {
        match self {
            Ok(()) => ().report(),
            Err(err) => Err::<!, _>(err).report(),
        }
    }
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值