Как я могу использовать Array#delete при итерации по массиву?

У меня есть массив, которого я хочу выполнить итерации и удалить некоторые элементы. Это не работает:

a = [1, 2, 3, 4, 5]
a.each do |x|
  next if x < 3
  a.delete x
  # do something with x
end
a #=> [1, 2, 4]

Я хочу a быть [1, 2]. Как я могу обойти это?

65
задан Christian Strempfer 1 October 2014 в 10:37
поделиться

3 ответа

a.delete_if {| x | x> = 3}

См. документацию по методу здесь

Обновление:

Вы можете обрабатывать x в блоке:

a.delete_if do |element|
  if element >= 3
    do_something_with(element)
    true # Make sure the if statement returns true, so it gets marked for deletion
  end
end
116
ответ дан 24 November 2019 в 15:23
поделиться

Я не долго задавал этот вопрос тому назад.

Удаление при итерации в Ruby?

Это не работает, потому что Ruby выходит из цикла .each при попытке удалить что-либо. Если вы просто хотите удалить что-то из массива, delete_if будет работать, но если вы хотите большего контроля, решение, которое у меня есть в этом потоке, работает, хотя и некрасиво.

3
ответ дан 24 November 2019 в 15:23
поделиться

Вам не обязательно удалять из массива, вы можете отфильтровать его так:

a = [1, 2, 3, 4, 5]

b = a.select {|x| x < 3}

puts b.inspect # => [1,2]

b.each {|i| puts i} # do something to each here
7
ответ дан 24 November 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: