如何在Ruby中声明二维数组

如何在Ruby中声明二维数组,ruby,arrays,multidimensional-array,matrix,conways-game-of-life,Ruby,Arrays,Multidimensional Array,Matrix,Conways Game Of Life,我想要一个Ruby中的二维数组,我可以访问它,例如: if @array[x][y] == "1" then @array[x][y] = "0" for i in 0..@array.length-1 for j in 0..@array[0].length-1 @array[i][j] ... 问题是:我不知道数组维度的初始大小,我对数组进行了扩展(Ruby的数组没有提供这种功能 您可以手动执行以下操作: (@array[x] ||= [])[y]

我想要一个Ruby中的二维数组,我可以访问它,例如:

if @array[x][y] == "1" then @array[x][y] = "0"
for i in 0..@array.length-1
        for j in 0..@array[0].length-1
            @array[i][j] ...

问题是:我不知道数组维度的初始大小,我对数组进行了扩展(Ruby的
数组
没有提供这种功能

您可以手动执行以下操作:

(@array[x] ||= [])[y] = 42
或者使用哈希:

@hash = Hash.new{|h, k| h[k] = []}
@hash[42][3] = 42
@hash # => {42 => [nil, nil, nil, 42]}

使用嵌套哈希的稀疏二维数组的简单实现

class SparseArray
  attr_reader :hash

  def initialize
    @hash = {}
  end

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

  def rows
    hash.length   
  end

  alias_method :length, :rows
end
用法:

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

Matt对你的问题的评论完全正确。但是,基于你标记了这个“康威生命游戏”的事实,看起来你正在尝试初始化一个二维数组,然后在游戏的计算中使用它。如果你想在Ruby中这样做,一种方法是:

a = Array.new(my_x_size) { |i| Array.new(my_y_size) { |i| 0 }}
这将创建一个用零填充的my_x_size*my_y_size数组


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

Ruby使用动态键入,因此不需要“声明”一个变量是一个二维数组。你可以做的是创建一个变量并将其初始化为数组。然后开始将数组放入其中。for array=array.new{array.new}需要更改为array=array.new(3){array.new(2)},需要有一个数字。我带着你的想法运行了使用哈希来编写SparseArray。Ruby way book中还有一个使用哈希的示例实现。你可以通过提供一个块来
fetch
hash.fetch(key){hash[key]={}
来避免
rescue
:fetch(key){hash[key]=}
会快得多。另外,
hash[key]|={}
更短,更常用。@Marc AndréLafortune:注:-)。提取和救援是不必要的。是否可以为每个维度使用.length方法?@ka2011r:是的,请参阅更新的代码。此外,您还可以混合可枚举模块并覆盖每个模块以获得更多功能。
class SparseArray
  attr_reader :hash

  def initialize
    @hash = {}
  end

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

  def rows
    hash.length   
  end

  alias_method :length, :rows
end
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
a = Array.new(my_x_size) { |i| Array.new(my_y_size) { |i| 0 }}