考虑一下:

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!宏,当传递一个错误时,它将continues一个包含循环:

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),这可能是最惯用的解决方案,因此如果你能使用这个答案,你可能应该这样做.

Rust相关问答推荐

通用池类型xsx

为什么幻影数据不能自动推断?

常量泛型和类型枚举箱有重叠的用途吗?

何时可以在Rust中退出异步操作?

如何使用syn插入 comments ?

rust 迹-内存管理-POP所有权-链表

使用铁 rust S还原对多个数组执行顺序kronecker积

如何用Axum/Tower压缩Html内容?

重写Rust中的方法以使用`&;mut self`而不是`mut self`

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

为什么';t std::cell::ref使用引用而不是非空?

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

AXUM一路由多个不包括URL的参数类型

我如何使用AWS SDK for Rust获取我承担的角色的凭据?

Rust 中的静态引用

Rust Serde 为 Option:: 创建反序列化器

在异步 Rust 中,Future 如何确保它只调用最近的 Waker?

将 (T, ()) 转换为 T 安全吗?

如何用另一个变量向量置换 rust simd 向量?

如何在宏中的多个参数上编写嵌套循环?