首页 > 解决方案 > 是否有一些语法糖可以在深度嵌套的选项和结果链上进行匹配?

问题描述

我发出的调用返回一个Option包含一个Result包含另一个Option包含自定义变体的一个。
我只对这样的特定变体结果链感兴趣:

if let Some(Ok(Some(CustomVariant(Some(value))))) = expr {
    // handle value case
}

这变得非常冗长并且没有真正的帮助,因为我实际上Result在我的所有代码中都将它视为一个单一的。我可以以某种方式为这段代码加上别名,这样我就可以做类似的事情,而不是编写整个Options 和s 链:Result

alias TheCase(value) = Some(Ok(Some(CustomVariant(Some(value))));
if let TheCase(value) = expr {
    //handle value
}

标签: syntaxrust

解决方案


您不需要这样的别名,只需使用一个函数来检索您想要的一个案例:

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
}

但是,我会考虑重构您的代码以不使用这种类型。Option<Result<_, _>>已经是红旗了,却Some(Ok(Some(CustomVariant(Some(…))))只是在精神错乱的边缘!


推荐阅读