Ale*_*kin 3 ruby arrays reduce
基于Symbol#to_proc实现,有一种众所周知的简写形式将块传递给任何方法.
代替:
[1,2,3].reduce(0) { |memo, e| memo + e }
# or
[1,2,3].reduce { |memo, e| memo.+(e) }
Run Code Online (Sandbox Code Playgroud)
有人可能写道:
[1,2,3].reduce &:+
Run Code Online (Sandbox Code Playgroud)
以上是后者"标准符号"的确切"同义词".
现在让我们有两个数组:
a = [[1,"a"],[2,"b"]]
b = [[3,"c"],[4,"d"]]
Run Code Online (Sandbox Code Playgroud)
两者都有
b.reduce(a) { |memo, e| memo << e }
# and
b.reduce(a) { |memo, e| memo.<<(e) }
Run Code Online (Sandbox Code Playgroud)
将正确更新a数组inplace,完全如下a.concat(b):
#? [[1,"a"], [2,"b"], [3,"c"], [4,"d"]]
Run Code Online (Sandbox Code Playgroud)
如果突然引发异常,则为短符号:
b.reduce(a) &:<<
#? TypeError: [[1, "a"], [2, "b"]] is not a symbol
Run Code Online (Sandbox Code Playgroud)
我错过了什么?Ruby 2.1.
PS由这个问题铸造.
b.reduce(a) &:<<
Run Code Online (Sandbox Code Playgroud)
将无法正常工作,因为它不是有效的方法调用.相反,将符号作为最后一个参数传递:
b.reduce(a, &:<<)
# => [[1, "a"], [2, "b"], [3, "c"], [4, "d"]]
Run Code Online (Sandbox Code Playgroud)
你打电话的时候:
[1,2,3].reduce &:+
Run Code Online (Sandbox Code Playgroud)
&:+是方法的一个参数.它实际上相当于:
[1,2,3].reduce(&:+)
Run Code Online (Sandbox Code Playgroud)
如果方法的最后一个参数在前面&,则它被认为是一个Proc
对象(Symbolto Proctrick).然后将其从参数列表中删除,并转换为块,然后该方法关联该块.
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |