代码之家  ›  专栏  ›  技术社区  ›  WoodenKitty

修改二维ruby数组有困难

  •  3
  • WoodenKitty  · 技术社区  · 14 年前

    有人能解释我做错了什么吗?

      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 回复  |  直到 12 年前
        1
  •  3
  •   Nakilon earlonrails    14 年前

    这条线 row.each do |column| column 值的副本 row

    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
    
        2
  •  1
  •   Chowlett    14 年前

    each 价值 column = 1 实际上并不修改数组。

    不过,你可以一步完成,看 the API docs Array#new . 尝试 a = Array.new(width) {|i| Array.new(height) {|j| 1 } }

        3
  •  0
  •   ghostdog74    14 年前

    你能这样创造吗?

    a=Array.new(width) { Array.new(height,1) }
    
        4
  •  -1
  •   Jordan Running    14 年前

    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