我想在Ruby中使用一个二维数组,我可以像这样访问:
if @array[x][y] == "1" then @array[x][y] = "0"
问题是:我不知道数组维度的初始大小,并且我增长了数组(使用<<
运算符)。
如何将其声明为实例变量,所以我没有这样的错误?
undefined method `[]' for nil:NilClass (NoMethodError)
@array = Array.new {Array.new}
现在适合我,所以下面马特的评论是正确的!
我刚刚发现我收到错误的原因是因为我迭代了这个数组:
for i in 0..@array.length
for j in 0..@array[0].length
@array[i][j] ...
这显然是错误的,并产生了错误。它必须是这样的:
for i in 0..@array.length-1
for j in 0..@array[0].length-1
@array[i][j] ...
答案 0 :(得分: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
用法:
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
答案 1 :(得分:5)
马特对你的问题的评论是完全正确的。然而,基于你已经标记了这个“conways-of-life”的事实,看起来你正在尝试初始化二维数组,然后在计算游戏中使用它。如果你想在Ruby中这样做,一种方法是:
a = Array.new(my_x_size) { |i| Array.new(my_y_size) { |i| 0 }}
将创建一个填充零的my_x_size * my_y_size数组。
这段代码的作用是创建一个x大小的新数组,然后将该数组的每个元素初始化为y大小的另一个数组,并用0来初始化每个第二个数组的每个元素。
答案 2 :(得分:3)
Ruby的Array
没有为您提供此功能。
您可以手动执行此操作:
(@array[x] ||= [])[y] = 42
或者你使用哈希:
@hash = Hash.new{|h, k| h[k] = []}
@hash[42][3] = 42
@hash # => {42 => [nil, nil, nil, 42]}