web-dev-qa-db-fra.com

Comment puis-je utiliser la suppression de tableau # lors de l'itération sur le tableau?

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?

65
Adrian

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
114
Chubas

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
7
Joc

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.

3
Jesse Jashinsky

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.

2
AlexChaffee