这是非常基本的,但有人可以用简单的英文解释这段代码究竟发生了什么?红宝石 - 创建网格
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