loops - 是否有展开或继续循环的快捷方式?

标签 loops rust pattern-matching control-flow

考虑一下:

loop {
    let data = match something() {
        Err(err) => {
            warn!("An error: {}; skipped.", err);
            continue;
        },
        Ok(x) => x
    };

    let data2 = match something_else() {
        Err(err) => {
            warn!("An error: {}; skipped.", err);
            continue;
        },
        Ok(x) => x
    };

    // and so on
}

如果我不需要将 ok 值分配给 data,我会使用 if let Err(err) = something(),但是有没有上面代码的快捷方式可以避免在我认为典型的情况下复制粘贴 Err/Ok 分支?类似 if let 的东西也会返回 ok 值。

最佳答案

虽然我认为 E_net4 的答案可能是最好的答案,但我正在为后代添加一个宏,以防万一创建一个单独的函数并使用 ? 运算符提前返回由于某种原因是不可取的。

这是一个简单的 skip_fail! 宏,它在传递错误时继续包含循环:

macro_rules! skip_fail {
    ($res:expr) => {
        match $res {
            Ok(val) => val,
            Err(e) => {
                warn!("An error: {}; skipped.", e);
                continue;
            }
        }
    };
}

这个宏可以用作let ok_value = skip_fail!(do_something());

Playground link which uses skip_fail to print out numbers divisible by 1, 2, and 3, and print an error when one of the divisions would truncate.

同样,我相信在单独的函数中使用 ? 并在没有失败的情况下返回 Ok(end_result) 可能是最惯用的解决方案,所以如果您可以使用您可能应该使用的答案。

关于loops - 是否有展开或继续循环的快捷方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49785136/

相关文章:

java - 如何按长度循环以下程序

rust - 如何在 Rust 中将十六进制字符串转换为 float ?

java - 扫描仪示例循环

javascript - 查找整数数组的最大子集,其总和等于给定目标

sql - 我是否需要使用函数来遍历唯一记录以进行批量更新?

Python 模式匹配正则表达式

regex - Excel 中的模式匹配计数(正则表达式和 VBA)

types - 在包含 nalgebra 的 VectorN 类型的结构上派生 Copy 时出错

templates - 为什么我不能让构造函数在显式定义另一个类型参数的同时推导出一个类型参数?

scala - Scala/Unfiltered 中的模式匹配语法