2015-10-23 98 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'。如果不清楚,告诉我。 –