Symbol#to_proc
实现,有一种众所周知的速记形式将块传递给任何方法. 代替:
[1,2,3].reduce(0) { |memo,e| memo + e }# or[1,3].reduce { |memo,e| memo.+(e) }
有人可能写道:
[1,3].reduce &:+
以上是后者“标准符号”的确切“同义词”.
现在让我们有两个数组:
a = [[1,"a"],[2,"b"]]b = [[3,"c"],[4,"d"]]
两者都有
b.reduce(a) { |memo,e| memo << e }# andb.reduce(a) { |memo,e| memo.<<(e) }
将正确更新数组inplace,就像a.concat(b)一样:
#⇒ [[1,"b"],[3,"d"]]
如果突然引发异常,则为短符号:
b.reduce(a) &:<<#⇒ TypeError: [[1,"b"]] is not a symbol
我错过了什么? Ruby 2.1.
附:铸造于this question.
解决方法b.reduce(a) &:<<
将无法正常工作,因为它不是有效的方法调用.相反,将符号作为最后一个参数传递:
b.reduce(a,&:<<)# => [[1,"d"]]
你打电话的时候:
[1,3].reduce &:+
&:是该方法的参数.它实际上相当于:
[1,3].reduce(&:+)
如果方法的最后一个参数前面是&,那么它被认为是Proc对象(符号到Proc技巧).然后将其从参数列表中删除,并转换为块,然后该方法关联该块.
总结以上是内存溢出为你收集整理的数组 – 运算符数组#<<以简写形式的reduce失败全部内容,希望文章能够帮你解决数组 – 运算符数组#<<以简写形式的reduce失败所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)