gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:01:26 25 4
gpt4 key购买 nike

考虑一下:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com