簡體   English   中英

如何在閉包中“斷開”外部循環(Proc,lambda)?

[英]How to `break` a outside loop in closure (Proc, lambda)?

loop { break }可以正常工作,但是

block = Proc.new { break }
# or
# block = lambda { break }
loop(&block) # => LocalJumpError: break from proc-closure

是否有可能break一個block variable

更新:

一個例子來解釋更多:

def odd_loop
    i = 1
    loop do
        yield i
        i += 2
    end
end

def even_loop
    i = 2
    loop do
        yield i
        i += 2
    end
end

# This work
odd_loop do |i|
    puts i
    break if i > 10
end

# This doesn't work
break_greater_10 = Proc.new do |i|
    puts i
    break if i > 10
end

odd_loop(&break_greater_10) # break from proc-closure (LocalJumpError)
even_loop(&break_greater_10) # break from proc-closure (LocalJumpError)

根據我的理解, Proc.new應該與block一樣工作(它可以從塊return一個函數),但我不明白為什么不能打破循環。

PS抱歉我的英文不好>〜<

要解決這個問題,你可以

raise StopIteration

這對我有用。

要從塊返回,您可以使用next關鍵字。

def foo
  f = Proc.new {next ; p 1}
  f.call
  return 'hello'
end

puts foo     # => 'hello' , without 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM