如何使长串的as_ref()。unwrap()序列更有意义?

时间:2018-10-10 11:08:06

标签: error-handling rust

Rust在?- same_position(L,[a,a,c],3,a). false. 上以更有意义的方式重新排序序列的惯用方式是什么?我有一组从数据库返回的值,并通过以下方式处理它们:

as_ref.unwrap()

也许我可以使用更高级别的功能进行迭代?

1 个答案:

答案 0 :(得分:4)

如果您不想使用此样板,可以使用try运算符(?)添加更多样板以使其看不到。请参阅此概念证明:

#![feature(try_trait)]

use std::fmt;
use std::error::Error;

#[derive(Debug)]
struct MyError;

impl Error for MyError {
    //
}

impl fmt::Display for MyError {
    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
        write!(f, "MyError")
    }
}

impl From<std::option::NoneError> for MyError {
    fn from(_: std::option::NoneError) -> MyError {
        MyError
    }
}

impl<'a> From<&'a std::io::Error> for MyError {
    fn from(_: &'a std::io::Error) -> MyError {
        MyError
    }
}

fn foo(i: &Result<Option<i32>, std::io::Error /* for example */>) -> Result<&i32, MyError> {
    Ok(i.as_ref()?.as_ref()?)
}

很遗憾,我认为您无法删除as_ref通话。