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
不应该这样做吗?
答案 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(它说意外返回)?
来自其封闭方法的块(和Proc
)return
。在您的示例中,没有封闭方法(块文字位于顶层),因此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之间存在两个差异:
Proc
中阻止和return
s return
。Proc
使用松散的参数绑定与类似于赋值的语义(事实上,在Ruby 1.9之前,它们使用赋值语义),lambdas和方法使用严格的参数绑定。这是我使用的一种愚蠢的助记符:"阻止"和Proc
韵和他们表现相同,"方法"和" lambda"都是希腊语,他们表现得一样。