修改二维ruby数组的困难

修改二维ruby数组的困难,ruby,arrays,multidimensional-array,Ruby,Arrays,Multidimensional Array,请原谅这个新手问题。我试图在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|

请原谅这个新手问题。我试图在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

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

如果您只想要一个填充了
1
s的二维数组,那么简单的操作如下:

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


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


each
将每个元素的值传递到块参数中,而不是元素本身,因此
column=1
实际上不会修改数组


不过,您只需一步即可完成此操作-有关各种形式的
Array#new
的详细信息,请参阅。试试
a=Array.new(width){i|Array.new(height){j|1}}

你可以这样创建它吗

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

它是行
行。每个do |列
变量
是行
中值的副本。不能以这种方式编辑其值。你必须做到:

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
或者更好:

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
或者更好:

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

“宽度”和“高度”混淆了吗?此外,这可以在没有块的情况下完成:Array.new(高度,Array.new(宽度,1))@steenslag,不,它不能。如果以这种方式构建多维数组,当您为其中一个元素赋值时,它将扩展到整个列。这就像
array=[[1]*w]*h
,您只需将指针复制到同一个一维数组。关于
宽度
高度
的混合-这是另一个问题,作者不应该讨论这个问题。它必须至少有一个块。请参阅Nakilon回答下的注释:此数组创建不起作用(尝试更改其中一个值)。不使用块变量时,不需要包含块变量。我不知道这一点。我假设它们就像方法参数,如果它们不存在,Ruby会抱怨。啊,好极了!