我知道hash.map(&:key)函数就像hash.map {| element | element.key}因为它在符号:key上调用to_proc。
但是为什么array.inject(:+)与array.inject {| sum,x |相同sum + x}?
谢谢。
答案 0 :(得分:0)
array.inject(:+)
在ruby inject
方法中,当没有传入任何块时,它会查看第一个参数是否为要使用的方法的符号(即:+
)。在这种情况下,它会将:+
识别为符号,并知道它需要对整个列表求和。
可以使用
array.inject(&:+)
首先调用to_proc
,效率稍低。
您可能想要使用
array.inject(0, :+)
在数组长度为0的情况下返回0(而不是nil)。在这种情况下,您的第一个参数不是符号,因此Ruby将查看要使用的方法的第二个参数。
答案 1 :(得分:0)
当inject
的唯一参数不是符号时,它将用作初始值,否则to_proc
和&
将应用于参数,并用作一个街区。当有两个参数时,第一个参数用作初始值,第二个参数必须是符号,并且将用于创建如上所述的块。
这样做的一个缺点是你不能使用符号作为inject
的初始值,但可能认为没有用例。我不认为这个规范是干净的。