gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:44 25 4
gpt4 key购买 nike

基于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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com