首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.inject与.each_with_object的对比分析

.inject与.each_with_object的对比分析
EN

Stack Overflow用户
提问于 2016-08-25 17:52:54
回答 1查看 954关注 0票数 4

我知道each_with_object不适用于像integer这样的不可变对象。

例如,(1..3).each_with_object(0) {|i,sum| sum += i} #=> 0

我们可以用inject来解决这个问题,之和将是6。太棒了!

让我们再举一个例子

代码语言:javascript
复制
("a".."c").each_with_object("") {|i,str| str += i} # => ""

这也不起作用,因为当我们做str+=i时,我们创建了一个新的对象

相反,我们需要

代码语言:javascript
复制
("a".."c").each_with_object("") {|i,str| str << i} # => "abc"

为什么当我用以下两种方式做inject时,我得到了奇怪的结果

代码语言:javascript
复制
("a".."c").inject("") {|i,str| str += i} # => cba

("a".."c").inject("") {|i,str| str << i} # => ERROR

为什么第一次打印abc是反向的?为什么第二个是错误呢?

我知道我们应该对可变对象使用.each_with_object,对于不可变的对象应该使用inject (比如Integer),但是可以像使用.each_with_object那样对可变对象使用.inject吗?有人能解释这些结果吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-25 18:24:02

为什么第一次印刷abc是相反的?

参数是向后的。Enumerable#inject

打印istr显示了问题。

代码语言:javascript
复制
$ ruby -e '("a".."c").inject("") {|i,str| puts "i   = #{i}"; puts "str = #{str}"; ret = str += i; puts "ret = #{ret}\n\n"; ret }'
i   = 
str = a
ret = a

i   = a
str = b
ret = ba

i   = ba
str = c
ret = cba

i是上次通过块返回的累计和。str是下一个值。您正在将前一个累积值添加到下一个值的末尾。你的论点倒过来了。第一个是和,第二个是下一个元素。

当这种情况被纠正的时候,效果很好。

代码语言:javascript
复制
$ ruby -e 'puts ("a".."c").inject("") {|sum,i| sum += i}'
abc

此外,--它是使用的块的返回值。改变str没有任何效果,它只是进一步混淆了事情。

代码语言:javascript
复制
$ ruby -e 'puts ("a".."c").inject("") {|sum,i| sum + i}'
abc

为什么第二个是错误呢?

但事实并非如此,在Ruby2.0.0和2.2.4中也不是。但它也有同样的问题,向后的args。

代码语言:javascript
复制
$ ruby -e 'puts ("a".."c").inject("") {|i,str| str << i} # => ERROR'
cba

$ ruby -v
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-darwin15]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39151803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档