传递的隐式块给出了局部跳转错误

时间:2017-11-11 11:29:36

标签: ruby

def my_function(&block)
  p block.call                                #1
  # lambda{return "inside the block"}.call    #2
end

p my_function{return "implicit block"}

为什么第1行给出一个LocalJumpError(它说意外返回)?

虽然根据我的第1行和第2行基本上是相同的。这里的block变量是一个proc对象,因此是一个lambda。
他们也不应该表现得一样。第2行一旦取消注释似乎没有给出错误

@Andre

def my_function(&block)
  p block.call                                #1
  # lambda{return "inside the block"}.call    #2
end

def abc
 p my_function{return "implicit block"}
end

abc

不应该这样做吗?

2 个答案:

答案 0 :(得分:1)

Lambda和Proc之间存在许多差异,例如,您可以在此post中看到。

其中一个是return在每种情况下的表现。

当你在Proc中return时,它将从它被调用的方法返回。

当你在Lambda中return时,它只返回到lambda代码之外。

LocalJumpError的原因很简单,因为您可能正在从ruby控制台调用return并且没有封闭方法可以返回。因此,如果您使用方法包围代码并调用它,它将起作用。

def test
  def my_function(&block)
    p block.call
  end

  p my_function{ return "implicit block" }
end

test

=> "implicit block"

答案 1 :(得分:0)

def my_function(&block)
  p block.call                                #1
  # lambda{return "inside the block"}.call    #2
end

p my_function{return "implicit block"}
     

为什么第1行给出一个LocalJumpError(它说意外返回)?

来自其封闭方法的块(和Procreturn。在您的示例中,没有封闭方法(块文字位于顶层),因此return没有任何内容。

Lambdas OTOH return来自他们自己,就像方法一样。

def my_function(&block)
  p block.call                                #1
  # lambda{return "inside the block"}.call    #2
end

def abc
  p my_function{return "implicit block"}
end

abc
     

不应该这样做吗?

是的,应该,而且确实如此。

为了完整性'清酒:方法/ lambda和块/ Proc s之间存在两个差异:

  • 从他们自己的封闭方法,lambdas和方法Proc中阻止和return s return
  • Blocks和Proc使用松散的参数绑定与类似于赋值的语义(事实上,在Ruby 1.9之前,它们使用赋值语义),lambdas和方法使用严格的参数绑定。

这是我使用的一种愚蠢的助记符:"阻止"和Proc韵和他们表现相同,"方法"和" lambda"都是希腊语,他们表现得一样。