某些块方法(例如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)
为什么后者不能采用符号?
答案 0 :(得分:1)
对于inject
,块(或替代)是强制性的。如果它没有通过一个块,则必须至少有一个参数,最后一个参数必须是一个符号,并且该块将由它构造。无论是什么,都没有歧义;最后一个参数用于在缺少块时构造一个块。
对于map
,块是可选的。如果没有给出块,则返回值将是Enumerator
实例。因此,根据信息块是否被传递,无法确定是否应该使用最后一个参数来构造块。
在map
的特定情况下,它不需要参数,所以有一种感觉,即应该将一个额外的参数视为一个块,但是判断是否最后一个参数会使事情变得复杂取决于arity,将被视为一个块。它也失去了未来改变方法的可能性的可能性。
答案 1 :(得分:0)
不确定,但我知道此运算符&
to_proc,inject()
方法接受2个args首先累积第二个proc
,但map()
只接受一个args proc
或block
。在inject()
中,first args(accum)可以是枚举中的第一项。
答案 2 :(得分:0)
这只是对某些方法中这种特殊情况的特殊处理,而在其他方法中缺乏这种处理。