如何用惯用的Ruby方式重写方法

时间:2014-04-19 17:37:43

标签: ruby

我有一个方法可以对数组数组(网格)的对角线求和。它的工作原理如下(假设中间值为1,这就是为什么1在最后被移除的原因......):

def sum_diagonals(grid)
  sum = 0
  0.upto(grid.size-1) do |i|
    sum += grid[i][i]
    sum += grid[i][grid.size-1-i]
  end
  sum-1
end

现在我想用一个代码块并在一行上以更Ruby的方式重写它。我尝试了以下内容:

def sum_diagonals(grid)
  (0..grid.size-1).inject(0) {|acc, i| acc += grid[i][i] + grid[i][grid-1-i] }
end

但它没有将FixNum隐式转换为Array。我知道计算为double的1或中间值将被计算两次。但忽略我确实想重写方法。有人能告诉我如何优雅地做到这一点吗?

2 个答案:

答案 0 :(得分:3)

发生错误是因为您尝试使用数组索引数组,因此请更改

(0..grid.size-1).inject(0) {|acc, i| acc += grid[i][i] + grid[i][grid-1-i] }

为:

(0..grid.size-1).inject(0) {|acc, i| acc += grid[i][i] + grid[i][grid.size-1-i] }

答案 1 :(得分:2)

def sum_diagonals2(grid)
  grid.each_index.inject{|acc, i| acc + grid[i][i] + grid[i][-1 - i]}
end