2010-12-22 47 views
3

爲什麼此代碼只刪除數組中的偶數元素?我希望for循環遍歷每個值0到3,並且每次刪除一個元素。但它只是刪除了[0]和[2]。我究竟做錯了什麼?謝謝advance--「delete_at」方法只刪除偶數組元素

a=%w(ant bat cat dog) 
puts a.inspect #output: ["ant", "bat", "cat", "dog"] 

for k in (0..3) 
    a.delete_at(k) 
end 

puts a.inspect #output: ["bat", "dog"] 

UPDATE--

謝謝您的回覆;我明白我現在在做什麼。爲了刪除數組中的每個元素,Array方法'shift'將是合適的。例如:

for each in (0..3) 
    a.shift 
    print a 
end 

這會將第一個元素移出數組,並將每個後續元素向前移動一個單元格。感謝您使用'each'的建議 - 我可以看到它是首選的語法。

UPDATE 2--

請問下面的代碼段是比較有代表性的正確的Ruby語法的?

(0..3).to_a.each do 
    a.shift 
    p a 
end 

感謝Glenn提供的有關刪除數組內容的建議。

+1

您的更新代碼不是用Ruby方式編寫的。 `each`是一個數組的迭代器,如`[1,2,3] .each {| n | p'},而不是`for`循環的變量。 – 2010-12-23 03:59:57

回答

6

因爲當你刪除元素0時,元素1將是原始數組的元素2。

Initially: 
[ant, bat, cat, dog] 

a.delete_at[0] => ant 
[bat, cat, dog] 

go to next element -> 1 

a.delete_at[1] => cat 
[bat, dog] 

go to next element -> 2 
a.delete_at[2] => nil (out of range) 

go to next element -> 3 
a.delete_at[3] => nil 
5

因爲您要刪除到位數組,第三次執行進入循環,你的陣列比的k的值短。

嘗試執行

a=%w(ant bat cat dog) 
puts a.inspect #output: ["ant", "bat", "cat", "dog"] 

for k in (0..3).to_a 
    p k 
    a.delete_at(k) 
    p a 
end 

puts a.inspect #output: ["bat", "dog"] 

下面是輸出

0 
["bat", "cat", "dog"] 
1 
["bat", "dog"] 
2 
["bat", "dog"] 
3 
["bat", "dog"] 

k2,你想在索引2刪除的元素,但你的陣列只能由2種元素的索引組成0和1.

PS。避免使用for。相反,使用each,是「更多面向Ruby的」。

2

好,Firas和西蒙娜已經回答了你的陳述的問題,但如果你真正想知道的是如何有效地做到這一點刪除,你可以刪除陣列中的所有元素具有:

a.clear 

和你可以用

刪除一系列元素
a.slice!(0..3) 

無論在哪種情況下都不需要迭代。