难以修改二维红宝石阵列

时间:2010-10-25 07:41:35

标签: 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|
       row.each do |column|
          column = 1
       end
     end
     return a
  end

4 个答案:

答案 0 :(得分:3)

变量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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

你可以像这样创建吗?

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

答案 3 :(得分:-1)

嵌套column循环中的

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

如果你只是想要一个填充了1的二维数组,那么这样就可以了:

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