Ruby注入嵌套循环

时间:2016-06-17 18:35:12

标签: ruby inject

def max_subarr(arr)
  start_index, end_index = 0,
  (0...arr.length).inject([arr.first]) do |max_sub, i|
    (i...arr.length).each do |x|
      if max_sub.inject(:+) < arr[i..x].inject(:+)
        max_sub = arr[i..x]
        start_index, end_index = i, x
      end
    end
    max_sub
  end
  return [start_index, end_index]
end

max_subarr([98, -99, 198, -2, 950]) # => [2,4]

当我们在嵌套循环中有max_sub时,有人可以解释为什么我们需要最后max_sub = arr[i..x]吗?而且,inject([arr.first]) do |max_sub, i|

的功能

1 个答案:

答案 0 :(得分:1)

确定:该块返回备忘录对象的新值。也就是说,产生于块的max_sub的下一个值将是上次返回的块。

inject method of Enumerable用于将二进制操作或任意块(如果提供)应用于Enumerable

对于Enumerable的每个元素,inject将应用操作或将备忘录对象和当前元素传递给块。

备忘录对象是参数,如果不存在,则是块的第一个元素。它通常通过块累积。块的每个产量都会产生备忘录的新值。然后返回备忘录对象的最后一个值。

这是一种将数据结构简化为汇总结果的结构化且可能具有功能的方法。

Full docs here.