マクロを使わずにオプションを結果に変換することを簡単にする方法はありますか? 質問する

マクロを使わずにオプションを結果に変換することを簡単にする方法はありますか? 質問する

私はこのようなものを持っています(実際の機能Ini::Section::get錆びたini):

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) => Ok(s),
            None => Err("no ini item".to_string()),
        }
    }
}

このマクロを実装せずにコードの重複を削除する方法はありますか?

ベストアンサー1

ok_orそしてok_or_elseメソッドはOptions をResults に変換し、演算子は早期戻り?に関連する定型句を自動化します。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)
}

おすすめ記事