难以修改二维rubyarrays

请原谅新手问题。 我正在尝试在ruby中创建一个二维数组,并将其所有值初始化为1.我的代码正在创建二维数组,但无法修改其任何值。

谁能解释我做错了什么?

def mda(width,height) #make a two dimensional array a = Array.new(width) a.map! { Array.new(height) } #init all its values to 1 a.each do |row| row.each do |column| column = 1 end end return a end 

row.each do |column| 变量columnrow值的副本。 您无法以这种方式编辑其值。 你必须这样做:

 def mda(width,height) a = Array.new(width) a.map! { Array.new(height) } a.each do |row| row.map!{1} end return a end 

或更好:

 def mda(width,height) a = Array.new(width) a.map! { Array.new(height) } a.map do |row| row.map!{1} end end 

或更好:

 def mda(width,height) a = Array.new(width){ Array.new(height) } a.map do |row| row.map!{1} end end 

或更好:

 def mda(width,height) Array.new(width) { Array.new(height){1} } end 

each元素的 each传递给block参数,而不是元素本身,所以column = 1实际上并没有修改数组。

但是,您可以一步完成此操作 – 有关各种forms的Array#new详细信息,请参阅API文档 。 尝试a = Array.new(width) {|i| Array.new(height) {|j| 1 } } a = Array.new(width) {|i| Array.new(height) {|j| 1 } }

你可以像这样创建吗?

 a=Array.new(width) { Array.new(height,1) } 

嵌套each循环中的column是数组中该位置的值的副本,而不是指向它的指针/引用,因此当您更改其值时,您只是更改副本的值(它不再存在于块)。

如果你只想要一个用1 s填充的二维数组,那么这将是有效的:

 def mda(width,height) [ [1] * width ] * height end 

很简单。


顺便说一下,如果你想知道在迭代它时如何修改二维数组的元素,这是一种方式(从代码中的第6行开始):

  #init all its values to 1 a.length.times do |i| a[i].length.times do |j| a[i][j] = 1 end end