gpt4 book ai didi

通过 lambda 的 Ruby 循环,如何中断?

转载 作者:太空宇宙 更新时间:2023-11-03 17:43:16 24 4
gpt4 key购买 nike

可以在 ruby​​ 中使用 lambda 来创建死循环:

a = 0
lambda = ->{ a += 1; puts "#{a}"; sleep 1}
loop &lambda
p a

现在我正在寻找一种方法来打破这种由lambda transferred into block 生成的循环。我曾经尝试过的两种明显的方法都没有完成循环,它们只是退出了 lambda,但循环仍然有效:

break 不会停止循环:

a = 0
lambda = ->{ a += 1; puts "#{a} break"; sleep 1; break; p "This line will not appears"}
loop &lambda
p a

return 也不会停止循环:

a = 0
lambda = ->{ a += 1; puts "#{a} return"; sleep 1; return; p "This line will not appears"}
loop &lambda
p a

如果我使用 proc 而不是 lambda 我可以 return 退出循环,但我也会退出程序:

a = 0
prc_ = Proc.new{a += 1; puts "#{a} proc return"; sleep 1; return; p "This line will not appears"}
loop &prc_
p a

同样的情况,当我在 proc 中使用 break 时,我只是从程序中抛出 LocalJumpError 异常。

a = 0
prc_ = Proc.new{a += 1; puts "#{a} proc break"; sleep 1; break; p "This line will not appears"}
loop &prc_
p a

最佳答案

您可以从 lambda 引发 StopIteration 异常:

a = 0
lambda = ->{ a += 1; puts "#{a}"; sleep 1; raise StopIteration if a>10}
loop &lambda
p a

Docs说:

loop() public Repeatedly executes the block. If no block is given, an enumerator is returned instead. (...)StopIteration raised in the block breaks the loop.

关于通过 lambda 的 Ruby 循环,如何中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49506671/

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