以下代码正常工作
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
答案 0 :(得分:2)
这是procs vs lambdas之间的区别(谷歌搜索将为您提供更多的资源)。
基本上,在第一种情况下,您的“return foo1”将从实验室返回 ,并且需要位于要返回的上下文中。
你可以使用lambda
来实现你想要做的事情p = lambda { return "from block" }
另外,请注意,在procs和lambdas中通常不需要return
语句;他们将返回最后评估的表达式。所以,它相当于:
p = Proc.new{ "from block" }
答案 1 :(得分:1)
如果你想从一个proc得到一个表达式,那么
p = Proc.new{ "from block" }
像Chubas建议的那样,您也可以使用next
,例如
p = Proc.new do
next "lucky" if rand < 0.5 #Useful as a guard condition
"unlucky"
end
答案 2 :(得分:0)
基本上在第二种情况下,在从Foo.doit(p)进行调用之前从Proc对象返回。由于p已经返回p.call,因此无法返回。