基于Symbol#to_proc
,有一种众所周知的简写形式可以将 block 传递给任何方法。实现。
代替:
[1,2,3].reduce(0) { |memo, e| memo + e }
# or
[1,2,3].reduce { |memo, e| memo.+(e) }
有人可能会写:
[1,2,3].reduce &:+
以上是后者“标准符号”的精确“同义词”。
现在让我们有两个数组:
a = [[1,"a"],[2,"b"]]
b = [[3,"c"],[4,"d"]]
虽然两者
b.reduce(a) { |memo, e| memo << e }
# and
b.reduce(a) { |memo, e| memo.<<(e) }
将正确更新 a
数组,就像 a.concat(b)
会做的那样:
#⇒ [[1,"a"], [2,"b"], [3,"c"], [4,"d"]]
短记号突然引发异常:
b.reduce(a) &:<<
#⇒ TypeError: [[1, "a"], [2, "b"]] is not a symbol
我错过了什么? ruby 2.1。
P.S. Actor this question .
最佳答案
b.reduce(a) &:<<
不会工作,因为它不是有效的方法调用。相反,将符号作为最后一个参数传递:
b.reduce(a, &:<<)
# => [[1, "a"], [2, "b"], [3, "c"], [4, "d"]]
当你打电话时:
[1,2,3].reduce &:+
&:+
是方法的参数。它实际上等同于:
[1,2,3].reduce(&:+)
如果一个方法的最后一个参数前面有&
,它被认为是一个Proc
对象(Symbol
到 Proc
技巧)。然后将其从参数列表中移除,并转换为 block ,然后该方法关联 block 。
关于arrays - 运算符 Array#<< 以 reduce 的简写形式失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32241609/