传递符号来阻止方法

时间:2014-04-21 08:13:36

标签: ruby syntax block symbols

某些块方法(例如inject)可以选择使用符号而不是块:

%w[a b c].inject(&:+)
# => "abc"
%w[a b c].inject(:+)
# => "abc"
%w[a b c].inject("", :+)
# => "abc"

map等其他块方法不能:

%w[a b c].map(&:upcase)
# => ["A", "B", "C"]
%w[a b c].map(:upcase)
# => ArgumentError: wrong number of arguments (1 for 0)

为什么后者不能采用符号?

3 个答案:

答案 0 :(得分:1)

对于inject,块(或替代)是强制性的。如果它没有通过一个块,则必须至少有一个参数,最后一个参数必须是一个符号,并且该块将由它构造。无论是什么,都没有歧义;最后一个参数用于在缺少块时构造一个块。

对于map,块是可选的。如果没有给出块,则返回值将是Enumerator实例。因此,根据信息块是否被传递,无法确定是否应该使用最后一个参数来构造块。

map的特定情况下,它不需要参数,所以有一种感觉,即应该将一个额外的参数视为一个块,但是判断是否最后一个参数会使事情变得复杂取决于arity,将被视为一个块。它也失去了未来改变方法的可能性的可能性。

答案 1 :(得分:0)

不确定,但我知道此运算符& to_proc,inject()方法接受2个args首先累积第二个proc,但map()只接受一个args procblock。在inject()中,first args(accum)可以是枚举中的第一项。

答案 2 :(得分:0)

这只是对某些方法中这种特殊情况的特殊处理,而在其他方法中缺乏这种处理。