Использование delete_at в цикле массива с Ruby - PullRequest
1 голос
/ 22 февраля 2011

Буду ли я прав, говоря, что было опасно использовать delete_at при переборе массива?Как насчет в следующей ситуации, когда после удаления завершается цикл и функция?

arr.each_index do |i|
  if arr[i] == 5
    arr.delete_at(i)
    return
  end
end

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

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

Конечно, ваш реальный пример можно сделать гораздо проще:

arr.delete_at(arr.index(5))

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

1 голос
/ 23 февраля 2011

Если вы хотите удалить все 5 с, а не только первый, вы можете сделать

new_arr = arr.reject{|x| x == 5}

Или, если вы в порядке с изменением существующего массива,

arr.reject!{|x| x == 5}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...