【问题标题】:How does inject handle the first element of an array when summing?求和时注入如何处理数组的第一个元素?
【发布时间】:2014-01-22 15:08:17
【问题描述】:

我有:

arr=[40, 50, 60, 70]

arr.inject do |sum,x|
  p x
  p sum
  if x>50
    sum=sum+x
  end
  p sum
end

为什么x 从 50 开始,sum 从 40 开始?我的猜测是x 将首先迭代 40 多个。更好的是,我如何使用inject 方法返回130?

【问题讨论】:

    标签: ruby arrays inject


    【解决方案1】:

    Inject 使用数组的第一个元素作为起始和,并从第二个元素开始执行块。您可以使用inject(0) do ..end 传递起始金额以进行注入。 然后它将以等于 0 的sum 开始,并从第一个元素开始执行块。另请注意,sum 被分配给已执行块的值,因此您的代码根本无法工作。应该是:

    arr=[40, 50, 60, 70]
    
    arr.inject do |sum,x|
      x > 50 ? sum+x : sum
    end
    

    不过我会写得稍微简单一些:

    arr=[40, 50, 60, 70]
    
    arr.select {|v| v > 50}.reduce(0, &:+)
    

    如果您正在使用 Active Support(来自 Rails),您可以这样做:

    arr.select {|v| v > 50}.sum
    

    【讨论】:

    • 感谢您的提示。我没有你的那么短,但我是在实验时写出来的。谢谢!
    【解决方案2】:

    如果您不为inject 方法提供参数,sum 的值将是数组中第一个元素的值。如果您希望它为 100,请以 arr.inject(100) 开头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 2021-01-21
      • 1970-01-01
      • 2023-03-11
      • 2010-12-31
      • 2012-04-21
      • 2018-06-12
      • 1970-01-01
      相关资源
      最近更新 更多