如何在Ruby中为2D数组中的类对象赋值

时间:2012-04-01 19:07:07

标签: ruby multidimensional-array

我有一个MapTile类,它包含一个tile精灵和tile的属性。我想创建一个2D数组,例如在10x10网格中保存100个图块。我使用一个只有瓷砖精灵的普通旧2D数组绘制了一个瓷砖地图,并且工作正常。但是,现在当我将一个tile精灵分配给名为mapData且包含MapTile类且使用mapData[i][j].tileSprite = tileNum的2D数组时,会为该列中的每个元素分配tileNum值。我已经尝试了所有我想到的工作。我是Ruby新手的C ++程序员。

class MapTile
attr_accessor :tileSprite, :attribute

    def initialize(sprite, attr)
    @tileSprite = sprite
    @attribute = attr
    end 

    def tileSprite
        @tileSprite
    end

    def attribute
        @attribute
    end

end



def array2D(width,height)
  a = Array.new(width, MapTile.new(123,0))
  a.map! { Array.new(height, MapTile.new(123,0)) }
  return a
end


@mapData = array2D(@mapSize,@mapSize)

mapData[1][j].tileSprite = tileNum  #Now every tileSprite in column 1 is tileNum

解决方案

将array2D方法更改为

def array2D(width,height)
a = Array.new(width) { MapTile.new(10,0)}
a.map! { Array.new(height) { MapTile.new(10,0) } }
return a
end

谢谢迈克尔!

1 个答案:

答案 0 :(得分:1)

您为每个数组元素使用相同的对象。请尝试使用Array.new(width) { MapTile.new(123,0) }

来自docs

# only one copy of the object is created 
a = Array.new(2, Hash.new)

# here multiple copies are created 
a = Array.new(2) { Hash.new }
BTW:你的代码中有些东西是相当单一的Ruby,你可能希望通过Code Review Stack Exchange来运行它。