inject
等一些 block 方法可以选择使用符号而不是 block :
%w[a b c].inject(&:+)
# => "abc"
%w[a b c].inject(:+)
# => "abc"
%w[a b c].inject("", :+)
# => "abc"
而 map
等其他 block 方法不能:
%w[a b c].map(&:upcase)
# => ["A", "B", "C"]
%w[a b c].map(:upcase)
# => ArgumentError: wrong number of arguments (1 for 0)
为什么后者不能带符号?
最佳答案
对于 inject
, block (或替代 block )是必需的。如果它没有传递一个 block ,那么必须至少有一个参数,最后一个参数必须是一个符号,并且 block 将由它构成。无论如何,都没有歧义;最后一个参数用于在缺少 block 时构造 block 。
对于map
, block 是可选的。如果没有给出 block ,则返回值将是一个 Enumerator
实例。因此,从一个 block 是否被传递的信息中,不能决定是否应该使用最后一个参数来构造一个 block 。
在 map
的特殊情况下,它不带参数,所以说一个额外的参数应该被当作一个 block 是有道理的,但是判断是否最后一个参数将根据 arity 被视为一个 block 。并且也失去了 future 改变方法元数的可能性。
关于ruby - 将符号传递给 block 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23193505/