Как сделать длинную последовательность цепочек as_ref (). Unwrap () более значимой? - PullRequest
0 голосов
/ 10 октября 2018

Какой идиоматический способ в 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
}

Может быть, я могу выполнить итерацию с вышестоящей функцией или чем-то еще?

1 Ответ

0 голосов
/ 10 октября 2018

Если вам не нужен этот шаблон, вы можете добавить еще один шаблон, чтобы он не отображался, с помощью оператора 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...