Ruby-创建网格

问题描述 投票:-2回答:2

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

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
ruby grid
2个回答
4
投票

我将首先更正您的代码,然后向您展示如何通过简化来改进它。

大概在您的代码之前初始化了数组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]] 

这显然不是您想要的。


0
投票

在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”]]

© www.soinside.com 2019 - 2024. All rights reserved.