Arrays 如何在ruby中就地求和数组元素?

Arrays 如何在ruby中就地求和数组元素?,arrays,ruby,Arrays,Ruby,如何在Ruby中创建一个新数组来对数组元素进行求和 [1,2,3,4,5].each_cons(2).map {|a, b| a + b } 给了我[3,5,7,9]但预期的结果是[1,3,6,10,15]它不是很优雅,但似乎有效: [1, 2, 3, 4, 5].each_with_object([]){|e, a| a.push(a.last.to_i + e)} # => [1, 3, 6, 10, 15] [1,2,3,4,5].each_with_object([]){|i,

如何在Ruby中创建一个新数组来对数组元素进行求和

[1,2,3,4,5].each_cons(2).map {|a, b| a + b }

给了我
[3,5,7,9]
但预期的结果是
[1,3,6,10,15]

它不是很优雅,但似乎有效:

[1, 2, 3, 4, 5].each_with_object([]){|e, a| a.push(a.last.to_i + e)}
# => [1, 3, 6, 10, 15]
[1,2,3,4,5].each_with_object([]){|i,l| l<<(l.last||0)+i}
#=> [1,3,6,10,15]

[1,2,3,4,5]。每个_与_对象([]){i,l | l有很多方法可以做到这一点。一种方法是创建一个
枚举器
实例并使用
注入

def adder array
  enum = Enumerator.new do |y|
    array.inject (0) do |sum, n|
      y << sum + n
      sum + n
    end
  end
  enum.take array.size
end

adder [1,2,3,4,5] #=> [1, 3, 6, 10, 15]
def加法器阵列 enum=枚举器。新do | y| array.inject(0)do | sum,n| y[1,3,6,10,15]
另一种变体:

> [1, 2, 3, 4, 5].reduce([]) {|acc, el| acc << el + (acc[-1] || 0); acc}
#=> [1, 3, 6, 10, 15]
[1,2,3,4,5]。减少([]){acc,el{acc[1,3,6,10,15]

Yuk.

更简单的理解,我认为:

temp_sum = 0
arr.map! {|e| temp_sum += e }
=> [1, 3, 6, 10, 15]

如果要创建新数组而不是现有数组,只需使用
map
而不是
map!

如果使用inject/reduce并且必须在块内的第二条语句中返回一个对象,这意味着您可能可以将每个_与_对象一起使用。
(sum+n)。点击&y.method(:@mudasobwa,是的,这是一个好主意。
to_i
会导致字符串失败。
to_i
当然是有约定的,即
为零。
to_i
返回
0
。只针对数字。@mudasobwa不确定你的意思。字符串来自哪里?虽然这可能解决问题,但添加总是好的解释为什么/如何工作。@sawa数组可能由任何对象组成,在上定义了
+
,我看不出有任何理由拒绝任何对象,除了
数值的
s。
a.push(a.last?a.last+e:e)
将适用于任何对象。到目前为止,这里的第一个答案是“原地”问题的一部分。它有产生N个和的缺点,但可以用
来解决。用_object(临时_sum)
@mudasobwa,fixed:)
arr.each_with _object(sum:0)。map!{e,acc | acc[:sum]+=e}
@mudasobwa,这太棒了。@SunnyMagadan,通常
到位
意味着
变异器
。但我要补充你的评论。@MuratUstuntas这太疯狂了(除此之外,这不是赢家,重新检查你的基准测试。)在选择合适的解决方案时,半纳秒的差异应该无关紧要。我同意@mudasobwa:您的基准测试基本上表明,这些实现之间没有很大的统计差异。因此,选择只取决于(比如)代码可读性和对所用方法的熟悉程度。是的,您是对的。我只说一句话。我如果我犯了错误,请原谅我。:)⇑ 欢迎,PHP!是的,只是老派的解决方案:)@MuratUstuntas“就地”是什么意思?@Stefan,我的意思是“就地”,即您应该更新原始数组,而不是创建新数组。@MuratUstuntas在这种情况下,“我如何创建新数组”有点误导。