在 Ruby 1.8 中,一方面 proc/lambda 与另一方面 Proc.new
之间存在细微差别。
- 这些区别是什么?
- 您能否就如何决定选择哪一个提供指导?
- 在 Ruby 1.9 中,proc 和 lambda 是不同的。怎么回事?
最佳答案
使用 lambda
创建的过程和使用 Proc.new
创建的过程之间的另一个重要但微妙的区别是它们如何处理 return
语句:
- 在
lambda
创建的过程中,return
语句仅从过程本身返回 - 在
Proc.new
创建的 proc 中,return
语句更令人惊讶:它不仅从 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
。
关于ruby - 什么时候用lambda,什么时候用Proc.new?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/626/