Lambda和proc的名字

时间:2014-01-19 10:52:25

标签: ruby terminology

是否有理由将lambda称为lambda而proc称为proc?
公平地说,我记得两者都是匿名函数......而且与Lambdas的相似性结束了。他们没有像Haskell的lambdas那样采取一个论点。

为什么一个人被称为lambda,两者都可以被称为lambda?
为什么有人用名字" proc"用于命名一个和" lambda"为了命名第二个?

PS。他们都属于一个班级Proc。方法lambda?显示它是否为 lambda

2 个答案:

答案 0 :(得分:2)

在ruby中,lambdas是一种特殊的Proc对象,其行为模仿方法。特别是,它会尊重arity:如果你给它错误的args数量,它就会出错。

请参阅这个答案(针对一个不相关的问题),了解它们之间的差异:

Why does Hash#select and Hash#reject pass a key to a unary block?

回复评论:lamba和proc两个产品都是Proc对象。唯一的区别是上面提到的arity行为,以及return语句会发生什么(请参阅问题评论中的相关链接)。

至于为什么他们这样被命名,看看它是Matz的选择imo:这是最自然的。他在一次采访中明确了他的意思:

  

每个人都有个人背景。有人可能来自Python,其他人可能来自Perl,他们可能会对语言的不同方面感到惊讶。然后他们走到我面​​前说:“我对这种语言的特性感到惊讶,所以Ruby违反了最不惊讶的原则。”等待。等待。最不出意的原则不仅适用于您。最小惊喜的原则意味着最少 我的 惊喜的原则。在你非常好地学习Ruby之后,这意味着最不惊讶的原则。例如,在我开始设计Ruby之前,我是一名C ++程序员。我用C ++编程专门用了两三年。经过两年的C ++编程,我仍然感到惊讶。

http://en.wikipedia.org/wiki/Ruby_(programming_language)#Philosophy

从这个角度来看,请注意lambda的行为与方法非常相似,并且在这方面有资格作为(匿名)函数。而proc没有。命名第一个“lambda”似乎是一个自然的选择(无论如何),而第二个不是由于在arity和return语句方面的差异。

答案 1 :(得分:0)

  

有没有理由为什么lambda被称为lambda而proc被称为proc?

让我们看看在 ruby​​ 1.8.7 中调用proclambda时发生了什么:

aa = lambda {|a| nil }
# => #<Proc:0xb7351850@(irb):6>
aa.call
# warning: multiple values for a block parameter (0 for 1)
# => nil 

aa = proc {|a| nil }
# => #<Proc:0xb73451cc@(irb):10> 
aa.call
# warning: multiple values for a block parameter (0 for 1)

正如我们所看到的,Ruby中的proclambda之间没有区别。我相信proc最初出现在Ruby。因为它只是Proc.new的别名,后者会创建Proc对象。然后lambda已添加到 ruby​​ 中,因为Lambda是计算机编程领域中所谓的匿名函数,开发人员可以使用该语言的知名名称查看那个功能课。

让我们看看发生在 ruby​​ 1.9.1 中的运算符:

aa = lambda {|a| nil }
# => #<Proc:0x8054340@(irb):1 (lambda)> 
aa.call
# ArgumentError: wrong number of arguments (0 for 1)
from (irb):2:in `call'
from (irb):2
from /home/malo/.rvm/rubies/ruby-1.9.1-p431/bin/irb:12:in `<main>'
aa = proc {|a| nil }
# => #<Proc:0x8319bf0@(irb):3> 
aa.call
# => nil 

正如我们所看到的,在 ruby​​ 1.9.2 (我猜是因为 ruby​​ 1.9 )中将属性 lambda 添加到{{1}实例说anonymouns函数不会接受错误的参数数量。因此,将 0 参数传递到 1 中需要引发Proc异常。将 0 参数传递到ArgumentError对象所需的 1 时,会默默地删除不必要的参数。

正如您所知, ruby​​ 1.9.1 已添加proc作为无参数->运算符的别名:

lambda