小编典典

何时使用 lambda,何时使用 Proc.new?

all

在 Ruby 1.8 中,一方面 proc/lambda 之间存在细微差别,另一方面Proc.new

  • 这些区别是什么?
  • 你能就如何决定选择哪一个提供指导吗?
  • 在 Ruby 1.9 中,proc 和 lambda 是不同的。这是怎么回事?

阅读 135

收藏
2022-04-04

共1个答案

小编典典

lambdaprocs created with和 procs created
with之间另一个重要但微妙的区别Proc.new是它们如何处理return语句:

  • lambda-created proc 中,return语句仅从 proc 本身返回
  • Proc.new-created proc 中,该return语句更令人惊讶:它不仅从 proc 中返回控制权, 而且还从包含 proc 的方法中返回控制!

这是lambda-created proc 的return实际操作。它以您可能期望的方式运行:

def whowouldwin

  mylambda = lambda {return "Freddy"}
  mylambda.call

  # mylambda gets called and returns "Freddy", and execution
  # continues on the next line

  return "Jason"

end


whowouldwin
#=> "Jason"

现在这是一个Proc.new-created procreturn做同样的事情。您将看到 Ruby 打破了广受赞誉的“最小惊喜原则”的案例之一:

def whowouldwin2

  myproc = Proc.new {return "Freddy"}
  myproc.call

  # myproc gets called and returns "Freddy", 
  # but also returns control from whowhouldwin2!
  # The line below *never* gets executed.

  return "Jason"

end


whowouldwin2         
#=> "Freddy"

由于这种令人惊讶的行为(以及更少的打字),我倾向于在制作 procs 时使用lambdaover 。Proc.new

2022-04-04