【问题标题】:Lambda's and proc's namesLambda 和 proc 的名称
【发布时间】:2014-01-19 10:52:25
【问题描述】:

lambda 被称为 lambda 而proc 被称为 proc 有什么原因吗?
公平地说,我记得两者都是匿名函数......这就是与 Lambdas 的相似之处。他们没有像 Haskell 的 lambdas 那样采用 1 个参数。

为什么一个被称为 lambda 而两者都可以被称为 lambda?
为什么有人用“proc”命名一个,用“lambda”命名第二个?

ps。他们都在一个班级,Proc。有方法lambda? 显示它是否是lambda

【问题讨论】:

标签: ruby terminology


【解决方案1】:

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

请参阅此答案(针对不相关的问题),了解它们之间的区别:

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

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

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

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

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

鉴于此,请注意 lambda 的行为方式与方法非常相似,并且在这方面符合(匿名)函数。而proc没有。命名这些“lambda”中的第一个似乎是一个自然的选择(无论如何对我来说),而第二个则不是因为涉及到 arity 和 return 语句的差异。

【讨论】:

  • 它没有解释为什么 lambda 是 lambda 以及为什么 proc 是 proc 等等。
  • 除了 Humpty Dumpty 的理由之外,不相信这句话能证明什么:“当我使用一个词时,它的意思就是我选择的意思——不多也不少。”
  • @DonalFellows:如果您对 Matz 有更好的引用,请将其添加为答案。因为据我所知,lambda vs proc 作为一个命名法就像决定使用 e.g. 一样随意。十进制或 FixNum。是的:谦虚的引述就像对 OP 的回复一样贴切:除了那天 Matz 头脑中的任何随机想法之外,没有任何理由。
  • @DonalFellows:我尽我所能添加了可能对大会感觉自然的内容。
  • 丹尼斯,你是说 lambda 是 (l)ike (a) (m) 方法,(b)oth (d)emand (a)rity?
【解决方案2】:

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)

正如我们所见,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 中知道的那样,添加了 -&gt; 作为无参数 lambda 运算符的别名:

 aa = -> { nil }
 # => #<Proc:0x8056ffc@(irb):1 (lambda)> 
 aa = -> {|a| nil }
 # SyntaxError: (irb):2: syntax error, unexpected '|'
     aa = -> {|a| nil }
              ^

【讨论】:

  • @Darek-Nedza 有什么有用的答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2014-04-20
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
相关资源
最近更新 更多