ruby - 什么时候用lambda,什么时候用Proc.new?

标签 ruby lambda proc

在 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/

相关文章:

c# - 与 C# 中的 Enumerable.Select 混淆

ruby - 如何评估 `Proc#==`?

ruby - 在 Ruby 中是否可以显式创建局部变量

ruby - 为什么 ruby 不引发异常?

ruby-on-rails - 如何设置 Google API 用户以使用服务帐户(Ruby 客户端)进行模拟?

android - Rhodes:无法检测到 NDK 工具链路径(损坏的 NDK 安装?)

typescript - typescript 中的lambda表达式类型

c# - LINQ "' s' is not in scope"when creating where clause dynamically

linux - 将/proc/1/environ 转换为变量脚本

mysql - 试图在 MySQL 数据库中设置日期时间字段的 Ruby 错误