如何在Ruby中声明二维数组

kad*_*ian 7 ruby arrays matrix multidimensional-array conways-game-of-life

我想在Ruby中使用一个二维数组,我可以像下面这样访问:

if @array[x][y] == "1" then @array[x][y] = "0"
Run Code Online (Sandbox Code Playgroud)

问题是:我不知道数组维度的初始大小,并且我增长了数组(使用<<运算符).

如何将其声明为实例变量,所以我没有这样的错误?

undefined method `[]' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

问题更新:

@array = Array.new {Array.new} 
Run Code Online (Sandbox Code Playgroud)

现在对我有用,所以下面马特的评论是正确的!

我刚刚发现我收到错误的原因是因为我迭代了这个数组:

for i in 0..@array.length
    for j in 0..@array[0].length
        @array[i][j] ...
Run Code Online (Sandbox Code Playgroud)

这显然是错误的,并产生了错误.它必须是这样的:

for i in 0..@array.length-1
        for j in 0..@array[0].length-1
            @array[i][j] ...
Run Code Online (Sandbox Code Playgroud)

csh*_*rin 7

使用嵌套Hashes的稀疏二维数组的简单实现,

class SparseArray
  attr_reader :hash

  def initialize
    @hash = {}
  end

  def [](key)
    hash[key] ||= {}
  end

  def rows
    hash.length   
  end

  alias_method :length, :rows
end
Run Code Online (Sandbox Code Playgroud)

用法:

sparse_array = SparseArray.new
sparse_array[1][2] = 3
sparse_array[1][2] #=> 3

p sparse_array.hash
#=> {1=>{2=>3}}

#
# dimensions
#
sparse_array.length    #=> 1
sparse_array.rows      #=> 1

sparse_array[0].length #=> 0
sparse_array[1].length #=> 1
Run Code Online (Sandbox Code Playgroud)


Mar*_*bot 5

马特对你的问题的评论是完全正确的.然而,基于你已经标记了这个"conways-of-life"的事实,看起来你正在尝试初始化二维数组,然后在计算游戏中使用它.如果你想在Ruby中这样做,一种方法是:

a = Array.new(my_x_size) { |i| Array.new(my_y_size) { |i| 0 }}
Run Code Online (Sandbox Code Playgroud)

这将创建一个填充零的my_x_size*my_y_size数组.

这段代码的作用是创建一个x大小的新数组,然后将该数组的每个元素初始化为y大小的另一个数组,并用0表示每个第二个数组的每个元素.