Ruby - 创建一个网格

时间:2015-10-23 16:03:10

标签: ruby grid

这是非常基本的,但有人可以用英语解释这段代码到底发生了什么?

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 个答案:

答案 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”]]