有没有办法在没有宏的情况下简化将选项转换为结果?

时间:2016-06-17 21:09:54

标签: rust

我有类似的东西(真正的函数是来自rust-iniIni::Section::get):

impl Foo {
    pub fn get<K>(&'a mut self, key: &K) -> Option<&'a str>
    where
        K: Hash + Eq,
    {
        // ...
    }
}

我必须多次打电话:

fn new() -> Result<Boo, String> {
    let item1 = match section.get("item1") {
        None => return Result::Err("no item1".to_string()),
        Some(v) => v,
    };
    let item2 = match section.get("item2") {
        None => return Result::Err("no item2".to_string()),
        Some(v) => v,
    };
}

要删除代码膨胀,我可以写一个像这样的宏:

macro_rules! try_ini_get {
    ($e:expr) => {
        match $e {
            Some(s) => s,
            None => return Result::Err("no ini item".to_string()),
        }
    }
}

有没有办法在没有这个宏实现的情况下删除代码重复?

1 个答案:

答案 0 :(得分:20)

ok_orok_or_else方法将Option转换为Result s,?运算符自动化与早期Err相关联的样板回报。

您可以执行以下操作:

fn new() -> Result<Boo, String> {
    let item1 = section.get("item1").ok_or("no item1")?;
    let item2 = section.get("item2").ok_or("no item2")?;
    // whatever processing...
    Ok(final_result)
}