k = [1,2,3,4,5]
for n in k
puts n
if n == 2
k.delete(n)
end
end
puts k.join(",")
# Result:
# 1
# 2
# 4
# 5
# [1,3,4,5]
# Desired:
# 1
# 2
# 3
# 4
# 5
# [1,3,4,5]
此相同的效果會發生與其他陣列迭代器,k.each:乾淨的解決這個ruby迭代器的技巧?
k = [1,2,3,4,5]
k.each do |n|
puts n
if n == 2
k.delete(n)
end
end
puts k.join(",")
具有相同的輸出。
這種情況發生的原因很明顯...... Ruby實際上並不是遍歷存儲在數組中的對象,而是將其轉換爲漂亮的數組索引迭代器,從索引0開始,每次增加索引,直到它結束。但是當你刪除一個項目時,它仍然會增加索引,所以它不會評估兩次相同的索引,這是我想要的。
這可能不是發生了什麼,但它是我能想到的最好的。
有沒有一個乾淨的方法來做到這一點?是否已經有一個內置的迭代器可以做到這一點?或者我將不得不將它弄髒並做一個數組索引迭代器,並且在項目被刪除時不增加? (或者通過陣列的克隆迭代,並從原來的數組中刪除)
澄清
我不只是想刪除一個數組的項目;對不起,如果這是明確的。我想要做的是遍歷每個元素,並「處理」它;這個過程有時可能會刪除它。爲了更加準確:
class Living_Thing
def initialize tracker,id
@tracker = tracker
@id = id
@tracker << self
end
def process
do_stuff
puts @id
if @id == 2
die
end
end
def die
do_stuff_to_die
@tracker.delete(self)
end
def inspect
@id
end
end
tracking_array = Array.new()
foo = Living_Thing.new(tracking_array,1)
bar = Living_Thing.new(tracking_array,2)
rab = Living_Thing.new(tracking_array,3)
oof = Living_Thing.new(tracking_array,4)
puts tracking_array.join(",") # => [1, 2, 3, 4]
for n in tracking_array
n.process
end
# result: only foo, bar, and oof are processed
理想情況下,我希望處理tracking_array中的所有項目。
當Living_Thing從tracking_array中移除時,Living_Thing#死亡必須調用; do_stuff_to_die清理必須註冊的事物。
這是爲Rails應用程序或只是Ruby? – Anurag 2010-06-09 04:42:38
這是純粹的紅寶石 – 2010-06-09 04:53:01