arrays - 运算符 Array#<< 以 reduce 的简写形式失败

标签 arrays ruby reduce

基于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 对象(SymbolProc 技巧)。然后将其从参数列表中移除,并转换为 block ,然后该方法关联 block 。

关于arrays - 运算符 Array#<< 以 reduce 的简写形式失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32241609/

相关文章:

c - fscanf 转 int 和数组

python - 编码-CountNonDivisible(Python,性能更好)

arrays - 获取数组中恰好低于匹配值的元素

ruby - Selenium Webdriver - Ruby 不支持的命令

ruby - 用 Ruby 中的正则表达式匹配三元组?

python - Python 中的列表理解是否以内存有效的方式减少?

c++ - 为什么数组中的数据被删除后还能用?

algorithm - 最小长度 L 的最大连续子序列和

python - python中reduce函数的行为

javascript - MyObject.prototype.reduce 回调无法访问数组方法