1

从 Ruby 2.0 开始,我创建了一个使用新关键字参数的小脚本。在编写代码时,blocks 和 lambdas 的行为让我感到惊讶。下面练习我发现的内容:

def print_parameters(proc = nil, &block)
  p "Block: #{block.parameters}" if proc.nil?
  p "Lambda: #{proc.parameters}" unless proc.nil?
end

print_parameters(-> (first, second = 'test') {})
print_parameters(&-> (first, second = 'test') {})
print_parameters {|first, second = 'test'|}

结果如下:

"Lambda: [[:req, :first], [:opt, :second]]"
"Block: [[:req, :first], [:opt, :second]]"
"Block: [[:opt, :first], [:opt, :second]]"

为什么创建一个块没有必需的参数,但使用 lambda 或从 lambda 创建的块呢?

4

2 回答 2

2

Ruby 中块的语义旨在使它们对迭代器尽可能有用,例如Integer#timesor Enumerable#each。由于块没有必需的参数,您可以执行以下操作:

10.times { puts "Hello!" }

...或者:

10.times { |i| puts i }

这也是Ruby 中next/return区别背后的原因。

Ruby“lambdas”是不同的;它们没有“优化”用作“循环体”(尽管如果你愿意,你可以这样使用它们)。它们对传递的参数数量更严格,这可能有助于捕获错误。

于 2013-04-21T21:22:07.660 回答
0

lambdas行为更像 ruby​​ 中的方法:当您定义一个方法时,如果需要参数,那么在调用该方法时您必须提供参数。块的行为更像procsprocs可以声明参数,但它们不需要它。

lambda语法实际上是proc用严格的数量创建的。如果你在哪里输出两个变量的类,你会看到 lambda 和 blocks 都是Proc. proc使用 lambda 语法创建的 s 将对方法响应 true #lambda?。另请查看此 SO 讨论以了解 lambda 和 procs 之间的其他一些行为区别。何时使用 lambda,何时使用 Proc.new?

于 2013-04-21T21:32:06.997 回答