2013-05-10 40 views
0

我一直在研究Ruby中的數組。特別是在Ruby Programming 1.9書籍中使用a[start, count]a[lower_range..upper_range]處理數組的效果。爲什麼array [2,2] ='data'從數組[]中移除元素?

具體來說,如果我有:

a = [1, 3, 5, 7, 9] 

和我做了以下內容:

a[2, 2] = 'cat' 

我得到的輸出爲:a => [1, 3, "cat", 9]

而不是我所期待的是[1, 3, "cat", "cat", 9]

編輯:謝謝大家爲你的inpu噸。所有的方法建議工作。我現在知道了。

我更喜歡有人建議Array.new方法,因爲以任意的範圍,像[2,N],我可以簡單地使用,a[2, n] = Array.new(n, "cat")

優秀,由於每個人。

回答

4

把它看成是用右側的所有東西代替等號左邊的所有東西。您正在用一個單一元素替換一個數組。如果要用多個元素替換它,請使用a[2, 2] = Array.new(2, 'cat')

+2

很好的回答,但我要指出的是,使用'Array.new'類似語法,將產生與每一個元素引用數組到同一個對象,所以如果你修改一個索引的元素,它們都會改變。 – 2013-05-10 21:51:18

3

會發生什麼情況是索引2中的兩個值被替換爲'cat'。你可以看到:

a = [1, 3, 5, 7, 9] 
a[2,2] # => = [5, 7] 
a[2,2] = 'cat' 
a # => [1, 3, 'cat', 9] 
array[start, count]

所以和array[range_start .. range_end]您更換陣列,並非所有在該範圍內的指標是部分

3

你選錯了方法。 []使得元素賦值(替代選擇的範圍上的另一個)

什麼是你的實際尋找的是fill

a = [1, 3, 5, 7, 9] 
#=> [1, 3, 5, 7, 9] 
a.fill('cat', 2, 2) 
#=> [1, 3, "cat", "cat", 9] 
2

元素賦值就像一個替代的定義範圍。看看Ruby documentation for this useage。此分配用您的RHS表達式替換位置2中的兩個數組條目。下面的表達式應該達到您所期望的結果:

a[2, 2] = ['cat', 'cat'] 

:)

+0

謝謝你的微笑:) – Senjai 2013-05-10 22:08:56