gpt4 book ai didi

ruby - .inject 与 .each_with_object 分析

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

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

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

我们可以通过注入(inject)来解决这个问题,总和将为 6。太棒了!

再举个例子

("a".."c").each_with_object("") {|i,str| str += i} # => ""

这也行不通,因为当我们执行 str+=i 时,我们创建了一个新对象

相反,我们需要做

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

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

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

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

为什么第一个打印的abc是反着写的?为什么第二个是错误的?

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

最佳答案

Why is the first printing abc in reverse?

参数是倒退的。参见Enumerable#inject .

打印 istr 显示问题。

$ 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 是最后一次通过区 block 返回的累加和。 str 是下一个值。您正在将先前的累积值添加到下一个的末尾。你有倒退的论据。第一个是和,第二个是下一个元素。

纠正后,它工作正常。

$ ruby -e 'puts ("a".."c").inject("") {|sum,i| sum += i}'
abc

此外,它是使用的 block 的返回值。改变 str 没有任何效果,它只会让事情更加困惑。

$ ruby -e 'puts ("a".."c").inject("") {|sum,i| sum + i}'
abc

And why is the second an error?

它不是,无论如何在 Ruby 2.0.0 或 2.2.4 中都不是。但它也有向后参数的问题。

$ 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]

关于ruby - .inject 与 .each_with_object 分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39151803/

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