2015-10-23 137 views
-3

這是非常基本的,但有人可以用簡單的英文解釋這段代碼究竟發生了什麼?紅寶石 - 創建網格

3.times do |row_index| 
    board[row_index] = [] 
    3.times do |column_index| 
     board[column_index] = [] 
     board[row_index][column_index] = nil 
    end 
end 
end 
+2

該代碼正在創建一個2維數組,3x3是準確的,條目設置爲「nil」。請注意,board [row_index] = []'將board [row_index]初始化爲一個空數組,以便'board [row_index] [column_index] = nil'有意義。但是,board [column_index] = []'不應該在那裏(這是一個錯誤),在整個事情之前,你應該有'board = []'。還有一個額外的「結束」,這是錯誤的。 – lurker

+0

代碼如何知道使它成爲一列與一列。 column_index和row_index是一個集合嗎?這意味着什麼。 – kbt

+0

爲什麼board [column_index] = []不應該在那裏? – kbt

回答

1

我將首先更正您的代碼,然後向您展示如何通過提高簡化性來改進它。

想必陣列board代碼之前被初始化,因爲額外的end和,可能是一種方法,我們需要:

def initialize_board(n, val) 
    board = Array.new(n) 
    n.times do |row_index| 
    board[row_index] = Array.new(n) 
    n.times do |column_index| 
     board[row_index][column_index] = val 
    end 
    end 
    board 
end 

initialize_board(3, nil) 
    #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 

你看到的是,以使該方法更健壯,我已經制作了主板的尺寸(n)和初始化值(val)變量。該方法必須返回board,因此我們需要board作爲倒數第二行。 (因爲它是被執行,該方法的最後一行,則不需要return board。)

首先,因爲你必須board[row_index] =...board必須以具有n元素的數組來創建。這就是Array.new(n)。同樣,既然你有board[row_index][column_index] =...board[row_index](爲row_index每個值)必須創建爲一個數組元素n

board[row_index] = Array.new(n) 

這工作,但它不是很紅寶石等。更好的是寫:

def initialize_board(n, val) 
    board = [] 
    n.times do |row_index| 
    row = [] 
    n.times { |column_index| row << val } # or row.push(val) 
    board << row # or board.push(val) 
    end 
    board 
end 

initialize_board(3, nil) 
    #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 

注意board被初始化爲空數組,然後填充行,然後board返回。同樣,row被初始化爲一個空數組,填充val的副本,然後附加到board。我們可以收緊了使用Enumerable#each_with_object

def initialize_board(n, val) 
    n.times.with_object([]) do |row_index, board| 
    board << n.times.with_object([]) { |column_index, row| row << val } 
    end 
end 

initialize_board(3, nil) 
    #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 

我們現在可以使用Array.new與塊創建每一行使用默認值:

def initialize_board(n, val) 
    n.times.with_object([]) do |row_index, board| 
    board << Array.new(n) { val } 
    end 
end 

initialize_board(3, nil) 
    #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 

,然後再做一遍:

def initialize_board(n, val) 
    Array.new(n) { Array.new(n) { val } } 
end 

arr = initialize_board(3, nil) 
    #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 

我最想提的還有一件事。假設我們設置:

arr[1][1] = 'cat' 

然後

arr #=> [[nil, nil, nil], [nil, "cat", nil], [nil, nil, nil]] 

預期。

但是,如果我們寫:

def initialize_board(n, val) 
    Array.new(n, Array.new(n, val)) 
end 

然後:

arr = initialize_board(3, nil) 
    #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 

arr[1][1] = 'cat' 

arr #=> [[nil, "cat", nil], [nil, "cat", nil], [nil, "cat", nil]] 

這顯然不是你想要的。

+0

非常感謝您抽出時間。您必須在陣列板內創建陣列行嗎?然後填充數組行?我不完全理解這裏發生了什麼 - n_times | row_index | row = [] n.times {| column_index | row << val}#或row.push(val) board << row#or board.push(val) end你是否需要在陣列板內創建一個數組行?然後你需要第二個參數是列索引? – kbt

+0

你可以改爲寫:'n.times do | row_index |板子[[]; n.times {| column_index | board [-1] << val}',但無論如何,您需要創建一個空數組,其中'val'附加了'n'次。我認爲使用重新初始化的數組'row'會更好,因爲每行都會開始爲空,然後在用'val''n'次填充後被添加到'board'。如果不清楚,告訴我。 –