gpt4 book ai didi

rust - 如何从 Rust 的闭包内部跳过循环迭代?

转载 作者:行者123 更新时间:2023-12-03 11:43:55 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What is the Rust way of using continue from inside a closure?

(1 个回答)


7 个月前关闭。




我正在学习如何在 Rust 中使用闭包并想出了这个:

fn main() {
repeat_five_times(&|i: usize| {
println!("{}", i);
})
}

fn repeat_five_times(each: &dyn Fn(usize) -> ()) {
for i in 0..5 {
each(i)
}
}
这是输出:
0
1
2
3
4
repeat_five_times函数显然会重复传递的代码五次,而且效果很好。
i 时,我想从闭包内部跳过迭代到达 3 :
fn main() {
repeat_five_times(&|i: usize| {
if i != 3 {
println!("{}", i);
}
else {
continue
}
})
}
我希望输出看起来像这样:
0
1
2
4
这不会编译,说 'continue' inside of a closure; cannot 'continue' inside of a closure .
我应该怎么做才能跳过迭代?我还能做些什么来完全停止循环?

最佳答案

控制流不在您的闭包内发生,因此您不能在您的闭包中使用控制流关键字。如果您只是删除 continue它按预期工作:

fn main() {
repeat_five_times(|i: usize| {
if i != 3 {
println!("{}", i);
}
});
}

fn repeat_five_times(each: fn(usize)) {
for i in 0..5 {
each(i)
}
}
playground

如果你想打破循环,你必须以某种方式将信息从你的闭包传达给你的循环。一种简单的方法是让闭包返回 bool表示上一次迭代是否成功,迭代是否应该继续。例子:
fn main() {
// closure returns true when to continue iterating
// but returns false when the loop should be stopped
repeat_five_times(|i: usize| {
println!("{}", i);
i < 3 // returns false on 3 or higher
});
}

fn repeat_five_times(each: fn(usize) -> bool) {
for i in 0..5 {
if !each(i) { // break if current iteration failed processing
break;
}
}
}
playground

关于rust - 如何从 Rust 的闭包内部跳过循环迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66108365/

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