2012-08-27 90 views
0

所以我有一個「堆棧級別太深」的錯誤,我敢肯定,我知道是什麼原因造成的。我正在開發基於瓦片的遊戲,並且我有所有的瓦片,並且爲了方便起見(每次需要使用路徑查找時都需要查看它),每個瓦片都有一個包含8個鄰居的「附近」數組。紅寶石避免「堆棧級別太深」與鏈接

但是,當我打印出一些用於調試的對象時,我經常遇到「堆棧級別太深」的錯誤。我認爲這是因爲每個圖塊在「附近」數組中都有相鄰的圖塊,然後再引回原始圖塊,在嘗試打印所有對象時創建一個循環。

我可以忍受這個,但如果我可以吃我的蛋糕並且吃它,它會好得多。我可以通過使用id或座標來引用tile來避免它,而不是直接引用對象。缺點是這意味着每次都要搜索對象。

那麼,有沒有辦法維護我當前的代碼,但防止「附近」陣列輸出打印,以便它停止理智?

希望這是明確的!當前代碼:

class Tile 
    attr_accessor :type, :x, :y, :z, :nearby, :t_id 

    @type = 0 

    @@count = 0 

    def initialize(x, y, z, type) 
     @x = x 
     @y = y 
     @z = z 
     @t_id = @@count 
     @@count += 1 

     @nearby = [] 

     @type = type 
    end 
end 
+0

你應該建立一個樹,並防止葉子從引用自己的根 – apneadiving

回答

1

紅寶石打印,當您將它傳遞給p對象的inspect方法的返回。你可以重寫你的類的檢查,使其只返回一個字符串,只有對你有用的信息。

例如:

class A 
    def inspect 
    "printing an instance of A" 
    end 
end 

當你打印:

irb> a = A.new  
irb> p a  
printing an instance of A 
+0

謝謝,這確實起作用。 – saward