Почему удаление элементов из списка в ruby ​​не работает внутри цикла for? - PullRequest
2 голосов
/ 03 марта 2011
some_list = ['a', 'b', 'c']

for l in some_list
  some_list.delete_at(some_list.index(l))
end

puts some_list.inspect

Получается, что в конце исполнения some_list равно ["b"].Разве это не должно удалить все?

Ответы [ 3 ]

8 голосов
/ 03 марта 2011

В первом цикле l имеет индекс 0, а 'a' удаляется.

Затем он снова зацикливается, и l находится с индексом 1, который теперь равен 'c' ('a' былудалил, помнишь?).Удаляет 'c' и делает:)

2 голосов
/ 03 марта 2011

Если вам абсолютно необходимо удалить во время итерации, выполняйте итерацию в обратном порядке, чтобы вы изменили массив за итерацией, а не перед ней.Но, как говорили другие, в этом случае вам, вероятно, не стоит зацикливаться.

2 голосов
/ 03 марта 2011

Есть несколько способов удалить элементы из списка в Ruby, которые проще и безопаснее, чем итерация по этому списку.

Например,

colors = ["red", "green", "blue"]

# delete named elements
colors.delete("red")
=> ["green", "blue"]

# find difference in list and assign back to list
colors = colors - colors
=> []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...