Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用惯用的Ruby方式重写方法_Ruby - Fatal编程技术网

如何用惯用的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或中间值是双倍的,它将被计数两次。但是忽略我确实想

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

发生错误是因为您试图使用数组索引数组,所以请更改

(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