如何用惯用的Ruby方式重写方法
我有一种方法,可以对数组(网格)的对角线求和。它的工作原理如下(假设中间的值为1,因此在末尾删除1…): 现在我想用一个代码块和一行代码以一种更Ruby的方式重写它。我尝试了以下方法:如何用惯用的Ruby方式重写方法,ruby,Ruby,我有一种方法,可以对数组(网格)的对角线求和。它的工作原理如下(假设中间的值为1,因此在末尾删除1…): 现在我想用一个代码块和一行代码以一种更Ruby的方式重写它。我尝试了以下方法: def sum_diagonals(grid) (0..grid.size-1).inject(0) {|acc, i| acc += grid[i][i] + grid[i][grid-1-i] } end 但它说没有将FixNum隐式转换为数组。我知道1或中间值是双倍的,它将被计数两次。但是忽略我确实想
def sum_diagonals(grid)
(0..grid.size-1).inject(0) {|acc, i| acc += grid[i][i] + grid[i][grid-1-i] }
end
但它说没有将FixNum隐式转换为数组。我知道1或中间值是双倍的,它将被计数两次。但是忽略我确实想重写这个方法。有人能告诉我如何优雅地执行此操作吗?发生错误是因为您试图使用数组索引数组,所以请更改
(0..grid.size-1).注入(0){acc,i|acc+=grid[i][i]+grid[i][grid-1-i]}
def sum_diagonals2(grid)
grid.each_index.inject{|acc, i| acc + grid[i][i] + grid[i][-1 - i]}
end
致:
(0..grid.size-1).injection(0){acc,i|acc+=grid[i][i]+grid[i][grid.size-1-i]}
一个带有枚举器的网格类的对角线可能更为简单like@Stefan您能解释一下如何使用枚举器生成网格类吗?是的,acc+=..
不需要。这是隐含的+1谢谢,但它不起作用。提供一半大小。-1-i
而不是大小-1-i
也非常好。
def sum_diagonals2(grid)
grid.each_index.inject{|acc, i| acc + grid[i][i] + grid[i][-1 - i]}
end