我有类似的东西(真正的函数是来自rust-ini的Ini::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()),
}
}
}
有没有办法在没有这个宏实现的情况下删除代码重复?
答案 0 :(得分:20)
ok_or
和ok_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)
}