J'ai un tableau sur lequel je veux répéter 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 que a
soit [1, 2]
. Comment contourner cela?
a.delete_if { |x| x >= 3 }
Voir la documentation de la méthode ici
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
Vous n'avez pas à supprimer du tableau, vous pouvez le filtrer de la manière suivante:
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
J'ai posé cette question il n'y a pas longtemps.
Suppression pendant l'itération dans Ruby?
Cela ne fonctionne pas car Ruby quitte le .each
boucle lorsque vous essayez de supprimer quelque chose. Si vous souhaitez simplement supprimer des éléments du tableau, delete_if
fonctionnera, mais si vous voulez plus de contrôle, la solution que j'ai dans ce fil fonctionne, bien que ce soit un peu moche.
Une autre façon de procéder consiste à utiliser reject!
, ce qui est sans doute plus clair car il a un !
ce qui signifie "cela va changer le tableau". La seule différence est que reject!
renverra nil
si aucune modification n'a été apportée.
a.delete_if {|x| x >= 3 }
ou
a.reject! {|x| x >= 3 }
fonctionnera bien.