是否有理由将lambda
称为lambda而proc
称为proc?
公平地说,我记得两者都是匿名函数......而且与Lambdas的相似性结束了。他们没有像Haskell的lambdas那样采取一个论点。
为什么一个人被称为lambda,两者都可以被称为lambda?
为什么有人用名字" proc"用于命名一个和" lambda"为了命名第二个?
PS。他们都属于一个班级Proc
。方法lambda?
显示它是否为 lambda 。
答案 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 中调用proc
和lambda
时发生了什么:
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中的proc
和lambda
之间没有区别。我相信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