3

可能重复:
何时使用 lambda,何时使用 Proc.new?

(我知道它已经被问了好几次,但我找不到满意的答案)有人可以解释一下 Blocks、Procs 和 Lambdas 以及为什么应该使用一个而不是另一个,什么情况下应该使用 proc,类似和/或拉姆达。对计算机内存也有影响。请提供实际示例。

4

1 回答 1

7

试试Robert Sosinski 的教程Chris Pine 的学习编程

对于更多的基础,我建议你阅读Why's (poignant) Guide to Ruby。本指南负责创建当今许多 Ruby 的 Pro!一定要看看!

乔伊·德维拉的解释

另一个重要但微妙的区别是 procs created withlambda和 procs created withProc.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

于 2012-07-20T14:29:17.250 回答