我发出的回调Option包含一个Result包含另一个Option包含自定义变体的调用.
我只对这样的特定变量结果链感兴趣:
if let Some(Ok(Some(CustomVariant(Some(value))))) = expr {
// handle value case
}
Run Code Online (Sandbox Code Playgroud)
这变得非常冗长,并没有真正的帮助,因为我实际上将它视为Result我所有代码中的单个.我可以以某种方式为这段代码添加别名,这样我就可以做类似的事情而不是编写整个Options和Results 链:
alias TheCase(value) = Some(Ok(Some(CustomVariant(Some(value))));
if let TheCase(value) = expr {
//handle value
}
Run Code Online (Sandbox Code Playgroud)
你不需要这样的别名,只需使用一个函数来检索你想要的一个案例:
fn oneCaseICareAbout(value: &Option<Result<Option<Foo>, Bar>>) -> Option<&Foo> {
if let Some(Ok(Some(CustomVariant(Some(value)))) = value {
Some(value)
} else {
None
}
}
if let Some(value) = oneCaseICareAbout(expr) {
//handle value
}
Run Code Online (Sandbox Code Playgroud)
但是我会考虑重构你的代码而不是使用这种类型.Option<Result<_, _>>已经是一面红旗,但Some(Ok(Some(CustomVariant(Some(…))))只是处于疯狂的边缘!