У меня есть массив, которого я хочу выполнить итерации и удалить некоторые элементы. Это не работает:
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]
. Как я могу обойти это?
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
Я не долго задавал этот вопрос тому назад.
Это не работает, потому что Ruby выходит из цикла .each
при попытке удалить что-либо. Если вы просто хотите удалить что-то из массива, delete_if
будет работать, но если вы хотите большего контроля, решение, которое у меня есть в этом потоке, работает, хотя и некрасиво.
Вам не обязательно удалять из массива, вы можете отфильтровать его так:
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