67 votes

Comment puis-je utiliser Array#delete tout en itérant sur le tableau ?

J'ai un tableau sur lequel je veux itérer et supprimer certains éléments. Cela ne fonctionne pas :

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]

Je veux a à être [1, 2] . Comment puis-je contourner ce problème ?

117voto

Chubas Points 8670

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

Voir la documentation de la méthode aquí

Mise à jour :

Vous pouvez gérer x dans le bloc :

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

7voto

Joc Points 855

Vous n'avez pas besoin de supprimer le tableau, vous pouvez le filtrer ainsi :

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

3voto

Jesse J Points 2673

J'ai posé cette question il n'y a pas longtemps.

Effacer pendant l'itération en Ruby ?

Cela ne fonctionne pas parce que Ruby quitte le processus de .each boucle en essayant de supprimer quelque chose. Si vous voulez simplement supprimer des choses du tableau, delete_if fonctionnera, mais si vous voulez plus de contrôle, la solution que j'ai proposée dans ce fil de discussion fonctionne, bien qu'elle soit assez moche.

2voto

AlexChaffee Points 2979

Une autre façon de le faire est d'utiliser reject! qui est sans doute plus claire puisqu'elle a une ! ce qui signifie "cela va changer le tableau". La seule différence est que reject! retournera nil si aucune modification n'a été apportée.

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

ou

a.reject! {|x| x >= 3 }

fonctionneront tous les deux sans problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X