当前位置:  开发笔记 > 后端 > 正文

为什么#each_with_object和#inject会切换块参数的顺序?

如何解决《为什么#each_with_object和#inject会切换块参数的顺序?》经验,为你挑选了1个好方法。

#each_with_object和#inject都可以用来构建哈希.

例如:

matrix = [['foo', 'bar'], ['cat', 'dog']]

some_hash = matrix.inject({}) do |memo, arr|
  memo[arr[0]] = arr
  memo # no implicit conversion of String into Integer (TypeError) if commented out
end
p some_hash # {"foo"=>["foo", "bar"], "cat"=>["cat", "dog"]}

another_hash = matrix.each_with_object({}) do |arr, memo|
  memo[arr[0]] = arr
end
p another_hash # {"foo"=>["foo", "bar"], "cat"=>["cat", "dog"]}

两者之间的关键差异之一是#each_with_object跟踪memo整个迭代,而#inject设置memo等于块在每次迭代时返回的值.

另一个区别是顺序或块参数.

有没有在这里传达意图?反转两种类似方法的块参数没有意义.



1> akuhn..:

他们有不同的血统.

each_with_object 已于2007年添加到Ruby 1.9中

inject 1980年回到Smalltalk

我想如果语言是从开头设计的两种方法,他们可能会期望参数顺序相同.但事实并非如此.inject自Ruby开始以来一直存在,而each_with_object仅在10年后才被添加.

inject 期望参数与Smalltalk的顺序相同 inject:into:

collection inject: 0 into: [ :memo :each | memo + each ]

这是左折.您可以将该集合视为从左侧折叠起来的长条纸,折叠功能的滑动窗口始终是已经折叠的部分以及剩余纸条的下一个元素

# (memo = 0 and 1), 2, 3, 4  
# (memo = 1 and 2), 3, 4                 
# (memo = 3 and 3), 4                    
# (memo = 6 and 4)                      

由于所有最初的方法Enumerable都取自Smalltalk而且Matz不想混淆那些熟悉Smalltalk的人,因此遵循Smalltalk惯例是有道理的.

任何人都不能有先见之明知道会在2007 each_with_object年引入Ruby 1.9 时发生,并且参数的顺序反映了方法名称的词法顺序,即each ... object.

因此,由于历史原因,这两种方法期望不同顺序的论证.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有