Ruby:将`& proc`和`proc`传递给方法之间的区别

时间:2014-05-09 21:54:50

标签: ruby

我从codeacademy上的问题略微修改了一些代码。代码是:

def print_list(array, first = 1)
  counter = first
  array.each do |array|
    puts "#{yield counter} #{array}"
    counter = counter.next
  end
end

proc = Proc.new do |n|
  "[#{100*n}]:"
end

print_list ["alpha", "beta", "gamma"], 5, &proc

如果我删除&从最后一行Ruby抛出一个参数错误。 &的目的是什么?这里?

2 个答案:

答案 0 :(得分:2)

如果删除&,则print_list会将proc视为自身的第三个参数,而不是块。 &符号将Proc对象转换为一个块,print_list关键字在yield内调用。

更简洁, proc只是一个参数,&proc是对传递给方法的块的引用。

您可能会发现this article对于理解proc和块之间的差异非常有用

答案 1 :(得分:1)

&表示proc应该作为一个块传递。

没有它," proc"将只是另一个(第三个)参数,因此您将获得参数错误(3为2)

没有&&并在print_list方法中直接将其用作proc ...但首先不能是可选的。你需要先通过或至少通过nil。

def print_list(array, first, proc)
  counter = first || 1
  array.each do |array|
    puts "#{proc.call counter} #{array}"
    counter = counter.next
  end
end