這是非常基本的,但有人可以用簡單的英文解釋這段代碼究竟發生了什麼?紅寶石 - 創建網格
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
這是非常基本的,但有人可以用簡單的英文解釋這段代碼究竟發生了什麼?紅寶石 - 創建網格
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
我將首先更正您的代碼,然後向您展示如何通過提高簡化性來改進它。
想必陣列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]]
這顯然不是你想要的。
非常感謝您抽出時間。您必須在陣列板內創建陣列行嗎?然後填充數組行?我不完全理解這裏發生了什麼 - n_times | row_index | row = [] n.times {| column_index | row << val}#或row.push(val) board << row#or board.push(val) end你是否需要在陣列板內創建一個數組行?然後你需要第二個參數是列索引? – kbt
你可以改爲寫:'n.times do | row_index |板子[[]; n.times {| column_index | board [-1] << val}',但無論如何,您需要創建一個空數組,其中'val'附加了'n'次。我認爲使用重新初始化的數組'row'會更好,因爲每行都會開始爲空,然後在用'val''n'次填充後被添加到'board'。如果不清楚,告訴我。 –
該代碼正在創建一個2維數組,3x3是準確的,條目設置爲「nil」。請注意,board [row_index] = []'將board [row_index]初始化爲一個空數組,以便'board [row_index] [column_index] = nil'有意義。但是,board [column_index] = []'不應該在那裏(這是一個錯誤),在整個事情之前,你應該有'board = []'。還有一個額外的「結束」,這是錯誤的。 – lurker
代碼如何知道使它成爲一列與一列。 column_index和row_index是一個集合嗎?這意味着什麼。 – kbt
爲什麼board [column_index] = []不應該在那裏? – kbt