在 Ruby 1.8 中,一方面 proc/lambda 之间存在细微差别,另一方面Proc.new。
Proc.new
lambdaprocs created with和 procs created with之间另一个重要但微妙的区别Proc.new是它们如何处理return语句:
lambda
return
这是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