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)
正如我们所见,proc 和 Ruby 中的 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 添加到 Proc 实例中说 anonymouns 函数不会接受错误的参数数量。因此,将 0 参数传递给 1 required 会引发 ArgumentError 异常。虽然将 0 参数传递到 proc 对象所需的 1 中,但会默默地删除不必要的参数。
正如您从 ruby 1.9.1 中知道的那样,添加了 -> 作为无参数 lambda 运算符的别名:
aa = -> { nil }
# => #<Proc:0x8056ffc@(irb):1 (lambda)>
aa = -> {|a| nil }
# SyntaxError: (irb):2: syntax error, unexpected '|'
aa = -> {|a| nil }
^