2017-11-11 28 views
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(它的意思是返回)?通过隐含块给出本地跳转错误

虽然根据我的第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

关于您的编辑:是的,它的工作原理。 –

+0

为什么你首先需要这个? – mudasobwa

回答

1

Lambda和Proc之间有很多不同之处,例如,您可以在此处看到post

其中之一是return在每种情况下的行为。

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

而您在在Lambda它只返回到lambda代码之外。

LocalJumpError的原因很简单,因为您可能从您的ruby控制台调用return,并且没有封闭的方法返回。所以如果你用一种方法来包围你的代码并且调用它,那么它就会工作。

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

    p my_function{ return "implicit block" } 
end 

test 

=> "implicit block" 
+0

你能再看看编辑过的问题吗?谢谢 –

+0

是的,我现在就发表评论。 –

+0

你说过“当你返回一个块(Proc)时,它将从它被调用的方法返回”。但是我回来了,也不应该把这个返回值作为p的参数。我的意思是为什么它需要一个新的方法来返回。 Proc.new或lambda不需要。我似乎无法得到这个。 –

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(ITS称意想不到的回报)?

一个块(和一个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 

不应该工作的呢?

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

为了完整性:有方法/ lambdas和块/ Proc秒之间差异:

  • 块和从它们的包封方法,lambda表达式Proc小号return和方法return从自己。
  • Blocks和Proc s使用松散的参数绑定和类似于赋值的语义(事实上,在Ruby 1.9之前,他们使用了赋值语义),lambda表达式和方法使用严格的参数绑定。

这里是一个样 - 愚蠢的记忆我用“块”和Proc韵和他们的行为一样,“方法”和“拉姆达”都是希腊语单词和他们的行为是相同的。