在Rust中惯用的方式是对as_ref.unwrap()中的序列重新排序以更有意义的方式是什么?我有一组从数据库返回的值,并通过以下方式处理它们:

pub fn get_results(result: &Result<Option<Vec<Node>>, error::Error>) -> &Vec<Vec<Value>> {
    &result
        .as_ref()
        .unwrap()
        .as_ref()
        .unwrap()
        .first()
        .unwrap()
        .series
        .as_ref()
        .unwrap()
        .first()
        .as_ref()
        .unwrap()
        .values
}

也许我可以使用更高功能或其他功能进行迭代?

最佳答案

如果不想使用此样板,可以使用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调用。

10-07 17:41