2010-08-23 167 views
2

下面的代码工作红宝石PROC问题

def lab 
    Proc.new { return "foo1" }.call 
    return "foo2" 
end 

puts lab #=> foo1 

以下不工作。为什么?。我得到LocalJumpError

class Foo 
    def self.doit(p) 
    p.call 
    end 
end 

p = Proc.new { 
    return 'from block' 
} 

a = Foo.doit(p) 

puts a #=> LocalJumpError: unexpected return 

回答

2

这是procs vs lambdas(谷歌搜索会让你获得更丰富的资源)之间的差异。

基本上,在第一种情况下,您的“返回foo1”从实验室返回,并且需要位于返回的上下文中。

你可以实现你想使用Lambda

p = lambda { return "from block" } 

还做什么,请注意您通常不需要在特效也不是一个lambda表达式语句return;他们将返回最后评估的表达式。所以,它相当于:如果你想从一个进程的表现,以及做

p = Proc.new{ "from block" } 

像藏袍建议

p = Proc.new{ "from block" } 
0

基本上在第二种情况下,你从PROC对象返回您在Foo.doit(P)的调用之前。由于p已经返回,p.call没有什么可返回的。

1

,你也可以使用next,例如

p = Proc.new do 
    next "lucky" if rand < 0.5 #Useful as a guard condition 
    "unlucky" 
end