【问题标题】:Differences between Proc and LambdaProc 和 Lambda 的区别
【发布时间】:2011-01-25 23:21:58
【问题描述】:

Ruby 在通过Proc.newlambda(或1.9 中的->() 运算符)创建的Procs 之间存在差异。似乎非 lambda Procs 将在块参数中传递一个数组;通过 lambda 创建的 Procs 不会。

p = Proc.new { |a,b| a + b}
p[[1,2]] # => 3

l = lambda { |a,b| a + b }
l[[1,2]] # => ArgumentError: wrong number of arguments (1 for 2)

有人了解这种行为背后的动机吗?

【问题讨论】:

  • 您可能已经知道这一点,但这是可行的:l = lambda{ |(a,b)| a+b }; l[[1,2]] #=> 3

标签: ruby functional-programming


【解决方案1】:

lambda 和非 lambda Procs 有两个主要区别:

  1. 就像方法一样,lambda 从自身返回,而非 lambda Procs 从封闭方法返回,就像块一样。
  2. 与方法一样,lambda 具有严格的参数检查,而非 lambda Procs 具有松散的参数检查,就像块一样。

或者,简而言之:lambda 的行为类似于方法,非 lambda Procs 的行为类似于块。

您所看到的是#2 的一个实例。除了非 lambda Proc 和 lambda 之外,尝试使用块和方法,您会看到。 (如果没有这种行为,Hash#each 将是一个真正的 PITA 使用,因为它确实 产生一个包含两个元素的数组,但你几乎总是想处理它作为两个参数。)

【讨论】:

  • 感谢您的快速回复。 Has#each / #sort 是我最初遇到这个问题的方式。我最终使用以下语法来避免 Proc.new 的冗长: ->((a,b)) { ... }
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 2012-07-31
  • 2020-10-03
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多