2013-03-15 35 views
6

loop { break }能正常工作,但如何在闭包中处理外部循环(Proc,lambda)?

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

是否有可能breakblock 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.对不起,我的英语不好>〜<

+0

你想用这个做什么? – 2013-03-15 10:06:33

+0

99%相关:http://stackoverflow.com/questions/626/when-to-use-lambda-when-to-use-proc-new – tokland 2013-03-15 10:43:57

+0

@Sergio请参阅更新,@tokland我知道'Proc中的不同。新'和'lambda',我要求在'closure'中的'break'' – 2013-03-15 10:55:58

回答

3

要从一个块返回,你可以使用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

3

为了解决这个问题,你可以

raise StopIteration 

这为我工作。