如何在ruby中设置二维数组的元素?

时间:2014-01-01 02:48:12

标签: ruby arrays multidimensional-array

我试过了:

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

2 个答案:

答案 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'