如何在闭包中处理外部循环(Proc,lambda)?
问题描述:
loop { break }
能正常工作,但如何在闭包中处理外部循环(Proc,lambda)?
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
工作一样块(可从return
块的功能),但我不明白为什么不能打破循环。
P.S.对不起,我的英语不好>〜<
答
要从一个块返回,你可以使用next
关键字。
def foo
f = Proc.new {next ; p 1}
f.call
return 'hello'
end
puts foo # => 'hello' , without 1
+0
'break'一个外部循环是不同的返回块 – 2013-03-15 10:56:57
+2
在你的情况下,你可以使用'lambda'并使用'return',我认为'next '对此不好(虽然它有效) – 2013-03-15 11:19:17
答
为了解决这个问题,你可以
raise StopIteration
这为我工作。
你想用这个做什么? – 2013-03-15 10:06:33
99%相关:http://stackoverflow.com/questions/626/when-to-use-lambda-when-to-use-proc-new – tokland 2013-03-15 10:43:57
@Sergio请参阅更新,@tokland我知道'Proc中的不同。新'和'lambda',我要求在'closure'中的'break'' – 2013-03-15 10:55:58