ruby proc问题

时间:2010-08-23 01:11:18

标签: ruby

以下代码正常工作

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

3 个答案:

答案 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,因此无法返回。