运算符数组 #<< 以简写形式 reduce 失败



有一种众所周知的简写形式,可以基于Symbol#to_proc实现将块传递给任何方法。

代替:

[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.被这个问题铸造。

b.reduce(a) &:<<

将不起作用,因为它不是有效的方法调用。相反,将符号作为最后一个参数传递:

b.reduce(a, &:<<)
# => [[1, "a"], [2, "b"], [3, "c"], [4, "d"]]

当你打电话时:

[1,2,3].reduce &:+

&:+是该方法的参数。它实际上相当于:

[1,2,3].reduce(&:+)

如果方法的最后一个参数前面是&,则它被视为Proc对象(SymbolProc技巧(。然后将其从参数列表中删除,并转换为块,然后该方法将该块关联起来。

相关内容

最新更新