看来我们可以随时使用&:+
。为什么inject
需要:+
而map
必须采取&:to_s
?如果原因是map
不能带符号但必须带一个块,那么也map
带符号是否有意义?
[1,3,5].inject(:+) # => 9 [1,3,5].inject(&:+) # => 9 [1,3,5].map(&:to_s) # => ["1", "3", "5"] [1,3,5].map(:to_s) # => ArgumentError: wrong number of arguments (1 for 0)
sawa.. 5
这是设计使然。inject
允许其他语法在map
需要块的情况下采用符号。
允许inject
但不允许使用符号参数的原因可能map
是因为inject
总是返回迭代的结果对象,而map
被设计为Enumerator
在缺少块时返回实例。并且如果没有该块,那么如果必须查看是否提供了符号参数以决定是否返回Enumerator
或映射的Array
实例,则会变得很复杂。因此,Ruby设计人员为方法制定了一条简单的规则,例如map
缺少块意味着返回值将是Enumerator
。
具有讽刺意味的是,inject
允许符号的缺点是不能将符号作为的初始值传递inject
。但可能是,Ruby的设计师认为这种情况很少见。
这是设计使然。inject
允许其他语法在map
需要块的情况下采用符号。
允许inject
但不允许使用符号参数的原因可能map
是因为inject
总是返回迭代的结果对象,而map
被设计为Enumerator
在缺少块时返回实例。并且如果没有该块,那么如果必须查看是否提供了符号参数以决定是否返回Enumerator
或映射的Array
实例,则会变得很复杂。因此,Ruby设计人员为方法制定了一条简单的规则,例如map
缺少块意味着返回值将是Enumerator
。
具有讽刺意味的是,inject
允许符号的缺点是不能将符号作为的初始值传递inject
。但可能是,Ruby的设计师认为这种情况很少见。