这是非常基本的,但是有人可以用英语简单地解释此代码中到底发生了什么吗?
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)
可以,但是不是很像Ruby。最好是写:
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]]
这显然不是您想要的。
在Ruby中尝试这种方式
输入n定义为n x n矩阵的大小
示例
如果n = 3
矩阵大小为3 x 3
n = gets.chomp.to_i
# Array('A'..'Z').sample is random value from A to Z
matrix = Array.new(n) { Array.new(n) { Array('A'..'Z').sample } }
[[[“ D”,“ A”,“ M”,“ V”],[“ X”,“ Q”,“ A”,“ E”],[“ P”,“ D”,“ L “,” S“],[“ V”,“ M”,“ P”,“ Z”]]