什么是触发器和lambdas?请举例说明

时间:2012-07-20 14:24:01

标签: ruby lambda block proc

  

可能重复:
  When to use lambda, when to use Proc.new?

(我知道有几次被问到但是我找不到满意的答案)有人可以解释一下Blocks,Procs和Lambdas以及为什么应该使用其他的,当一个人应该使用proc时会出现什么情况,类似和/或lambda。还会对计算机内存产生影响。请举例说明。

1 个答案:

答案 0 :(得分:7)

尝试Robert Sosinski's TutorialLearning to Program by Chris Pine

为了获得更多基础,我建议您阅读Why’s (poignant) Guide to Ruby。本指南负责创建许多现在的Ruby专业版!一定要看看!

Joey deVilla的解释

另一个重要但微妙的区别在于使用lambda创建的procs和使用Proc.new创建的procs处理return语句的方式:

  • lambda - 创建的proc中,return语句仅从proc本身返回
  • Proc.new创建的proc中,return语句更令人惊讶:它不仅从proc,返回控件,还从包含proc的方法返回控件!

这是lambda - 创建了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 - 创建的proc return做同样的事情。你将要看到其中一个案例,其中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"

由于这种令人惊讶的行为(以及较少的输入),我倾向于在制作过程时使用lambda而不是Proc.new