我试过了:
1.9.3-p448 :046 > a=Array.new(7){Array.new(7)}
=> [[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil]]
1.9.3-p448 :047 > a[0,0]='a'
=> "a"
1.9.3-p448 :048 > a[0,1]='b'
=> "b"
1.9.3-p448 :049 > a[0,2]='c'
=> "c"
1.9.3-p448 :050 > a[1,0]='d'
=> "d"
1.9.3-p448 :051 > a[1,1]='e'
=> "e"
1.9.3-p448 :052 > a[1,2]='f'
=> "f"
我得到了:
1.9.3-p448 :053 > a
=> ["c", "f", [nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil]]
但我想要
1.9.3-p448 :053 > a
=> ["a","b","c",nil,nil,nil], ["d","e","f", nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil]]
答案 0 :(得分:5)
在Ruby中,正如@Daniel指出的那样,访问多维数组元素就像在C中完成一样。
您尝试使用的符号来自例如Pascal,但不会像您认为的那样在Ruby中工作。它在Ruby中的作用是给出一个起始索引和一个计数。
所以如果你有:
a = ['a','b','c','d','e','f']
然后a[2,3]
将是:
['c','d','e']
这在Ruby Array class documentation中有所描述。如果您尝试分配给它,Ruby将相应地动态更改数组。在上面的例子中,如果我这样做:
a[2,3] = 'h'
然后a
将成为:
['a','b','h','f']
或者如果我这样做:
a[2,0] = 'j'
Ruby在第2位插入一个值,现在我得到:
['a','b','j','h','f']
换句话说,为a[2,3]
分配一个值会替换三个值的子数组,而不是我赋予它的任何内容。在二维数组的情况下,例如在原始示例中,
a[0,0] = 'a' # Inserts a new first row of array with value 'a'
a[0,1] = 'b' # Replaces the entire first row of array with 'b'
a[0,2] = 'c' # Replaces the entire first two rows of array with 'c'
a[1,0] = 'd' # Inserts a new first row of array with value 'd'
a[1,1] = 'e' # Replaces the entire second row of array with 'e'
a[1,2] = 'f' # Replaces the entire second and third rows of array with 'f'
因此,你得到了你看到的结果。
答案 1 :(得分:4)
您当前正在为外部数组的范围指定字母。这是引用内部数组的语法:
a[0][0]='a'