2011-12-01 68 views
0

可能重复:
Using 'return' in a Ruby block为什么LocalJumpError?

我是新来的Ruby和感到惊讶的是这个片段raise一个LocalJumpError当块return

$bail_if = proc { |condition| 
    if condition 
    puts 'the condition is true' 
    return 
    else 
    puts 'the condition is false' 
    end 
} 

def method some_condition 
    $bail_if[some_condition] 
end 

method true 

如果我将bail_if定义为def method中的局部变量,则重新是没有问题的。为什么是这样?

+1

适用于红宝石1.8.7。你运行红宝石1.9吗? –

+0

Woops,忘记提及我正在使用1.9.2p290。谢谢! – sivabudh

+1

你问这是因为如果'some_condition'为true需要'方法'返回,但是否则继续运行'method'方法的其余部分?顺便说一下,'method'不是一个理想的名称,因为已经有[方法称为方法](http://www.ruby-doc.org/core-1.9.3/Object.html#method-i-方法) –

回答

2

将您的proc { |condition|更改为lambda { |condition|。 proc对象具有块语义,而lambda对象具有方法语义。因为proc对象就像一个块,所以当你调用一个执行return语句的proc时,它会尝试从封装了被转换为proc的块的方法返回。你在第一种情况下没有这种方法,因此你得到LocalJumpError。当你在你的方法中将你的proc定义为一个局部变量时,所有工作都正常。

+0

它不会抛出异常,但我不认为它会做OP想要它做的事情。 –

2

你没有return从红宝石1.9中的proc(又名块)。摆脱明确return似乎修复它。但是return在这里完全没用。

或者如果您确实需要明确的回报,请使用lambda而不是像@WarHog所示。