2016-08-22 121 views
0

所以我有一個井字棋board類。見下文:Ruby二維數組賦值

class Board 
    attr_accessor :grid 

    def initialize(grid = Array.new(3, Array.new(3, nil))) 
    @grid = grid 
    end 

    def place_mark(position, symbol) 
    @grid[position[0]][position[1]] = symbol 
    end 
end 

每當調用place_mark方法,並試圖分配一個符號到2D陣列中的元素,則整列被分配。

board = Board.new 
board.place_mark([0,0], :x) 

會導致

[[:X, nil, nil], 
[:X, nil, nil], 
[:X, nil, nil]] 

當期望的結果是

[[:X , nil, nil], 
[nil, nil, nil], 
[nil, nil, nil]] 

我找到了解決我的問題,在initialize方法,我只需要指定默認值像這樣的網格:

def initialize(grid = [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]) 
    @grid = grid 
end 

然後place_mark方法工作得很好。

所以我的問題是如何使兩個不同的數組聲明不同,使他們表現這種方式?

+0

Ruby中沒有多維數組(除非您從標準庫中計算Matrix),只需要數組的陣列,數組的陣列等。 –

回答

2

問題是,Array.new(3, Array.new(3, nil))給你一個數組相同的陣列在它三次。

這就像這樣:

x = Array.new(3, nil) 
grid = Array.new(3, x) 

所以,你必須包含x三次的數組。你真的想要三個獨立的數組,每個數組可以有自己的值。

http://ruby-doc.org/core-2.3.1/Array.html

注意,第二個參數與填充到相同的對象引用的數組。因此,僅當您需要使用本地不可變對象(例如符號,數字,true或false)實例化數組時才推薦使用它。

要創建一個帶有單獨對象的數組,可以改爲傳遞一個塊。此法安全與可變對象,如哈希值,字符串或其他陣列使用:

Array.new(4) { Hash.new } #=> [{}, {}, {}, {}] 

這也是一個快速的方法來建立多維數組:

empty_table = Array.new(3) { Array.new(3) } 
#=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 

這最後例子正是你想要的。

+0

非常感謝。這完全回答了我的問題。 – davidhu2000