我有一个方法可以对数组数组(网格)的对角线求和。它的工作原理如下(假设中间值为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或中间值将被计算两次。但忽略我确实想重写方法。有人能告诉我如何优雅地做到这一点吗?
答案 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