从 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 创建的块呢?