在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
调用。