这是非常基本的,但有人可以用英语解释这段代码到底发生了什么?
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
答案 0 :(得分:2)
我将首先更正您的代码,然后向您展示如何通过增加简化来改进它。
假设数组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]]
显然不是你想要的。
答案 1 :(得分:1)
在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”]]