154 votes

Ruby Array find_first object ?

Est-ce que j'ai manqué quelque chose dans la documentation de Array ? J'ai un tableau qui contient jusqu'à un objet répondant à un certain critère. J'aimerais trouver efficacement cet objet. La meilleure idée que j'ai trouvée dans la documentation est la suivante :

candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?

Mais je suis insatisfait pour deux raisons :

  1. Ce select m'a fait traverser tout le tableau, alors qu'on aurait pu abandonner après le premier coup.
  2. J'avais besoin d'une ligne de code (avec une condition) pour aplatir les candidats.

Les deux opérations sont inutiles si l'on sait à l'avance qu'il y a 0 ou 1 objet satisfaisant.

Ce que j'aimerais, c'est quelque chose comme :

array.find_first(block)

qui retourne nil ou le premier objet pour lequel le bloc est évalué à true, terminant la traversée à cet objet.

Dois-je l'écrire moi-même ? Toutes ces autres méthodes géniales dans Array me font penser que c'est là et que je ne le vois pas.

234voto

Mladen Jablanović Points 22082

Soit je ne comprends pas votre question, soit Enumerable#find est la chose que vous cherchiez.

105voto

Sandip Ransing Points 2344

Utiliser un tableau detect si vous vouliez renvoyer la première valeur lorsque le bloc renvoie vrai.

[1,2,3,11,34].detect(&:even?) #=> 2

OR

[1,2,3,11,34].detect{|i| i.even?} #=> 2

Si vous voulez renvoyer toutes les valeurs où le bloc renvoie vrai, utilisez alors select

[1,2,3,11,34].select(&:even?)  #=> [2, 34]

25voto

sepp2k Points 157757

Je suppose que vous avez manqué la méthode de recherche dans la documentation :

my_array.find {|e| e.satisfies_condition? }

16voto

Taryn East Points 9698

Avez-vous besoin de l'objet lui-même ou avez-vous juste besoin de savoir s'il y a est un objet qui satisfait. Dans le premier cas, alors oui : utilisez find :

found_object = my_array.find { |e| e.satisfies_condition? }

sinon vous pouvez utiliser any?

found_it = my_array.any?  { |e| e.satisfies_condition? }

Ce dernier répondra par "true" lorsqu'il en trouvera un qui satisfait à la condition. La première fera la même chose, mais retournera l'objet.

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