为什么是LocalJumpError?

时间:2011-12-01 20:47:51

标签: ruby block

  

可能重复:
  Using 'return' in a Ruby block

我是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定义为局部变量,则没有问题。这是为什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

你不是来自ruby 1.9中proc(aka block)的return。摆脱明确的return似乎解决了这个问题。但无论如何return在这里完全没用。

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