我有一个返回Result
类型的函数。在这个函数中,另一个返回类型的函数被调用Result
。并且,如果返回的值是一个Err
变体,则在冒泡该错误之前调用一个函数/闭包,否则,如果它是Ok
变体,则调用一个函数/闭包,然后简单地返回所包含的值。这是我到目前为止写的内容
fn foo1() -> Result<i32, String> {
Err("error".to_string())
}
fn foo2() -> Result<String, bool> {
let res = foo1().map_err(|err| {
println!("foo1 failed {}", err);
false
})?;
// I know I can call some closure in here, but I want something like map_err which will call different closures depending on the Result variant
Ok(res.to_string())
}
fn main() {
foo2();
}
我想说的是,您的需求可能已经足够专业化,您应该直接放弃
match
并实现您实际需要的东西。组合子和高阶函数的作用是指引方向并向读者提供语义信息,但如果它们不能直接应用或不能使事情变得更清晰,那么完全没有必要使用它们。
因此我们可以将您的代码片段解糖如下:
我不认为我们的处境因此而变得更糟。事实恰恰相反:使用 raw
match
实际上向读者(包括未来的你)发出信号,表明我们正在执行一组不明显的转换。我认为我可以使用如下方法的
map
组合map_err