Ruby Array trouver le premier objet?

Est-ce que je manque quelque chose dans la documentation du tableau? J'ai un tableau qui contient jusqu'à un objet satisfaisant un certain critère. J'aimerais trouver efficacement cet objet. La meilleure idée que j'ai des docs 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, même si nous aurions pu renflouer après le premier coup, et (2) j'avais besoin d'une ligne de code (avec une condition) pour aplatir les candidats. Les deux opérations sont inutiles avec la prescience qu'il y a 0 ou 1 des objets satisfaisants.

Ce que je voudrais, c'est quelque chose comme:

array.find_first(block) -> Réponses nil ou le premier objet pour lequel le bloc évalue à true, mettant fin à la traversée à cet objet.

Dois-je écrire cela moi-même? Toutes ces autres grandes méthodes dans Array me font penser qu'il est là et je ne le vois tout simplement pas.

Merci d'avance, Dan

103
demandé sur marcgg 2010-03-04 20:04:31

4 réponses

, Soit je ne comprends pas votre question, ou Énumérable#find est la chose que vous recherchez.

154
répondu Mladen Jablanović 2017-05-14 19:37:47

Utilisez la méthode array detect Si vous voulez retourner la première valeur où block renvoie true

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

OR

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

Si vous voulez retourner toutes les valeurs où block renvoie true, utilisez select

[1,2,3,11,34].select(&:even?)  #=> [2, 34]
74
répondu Sandip Ransing 2012-04-17 10:14:51

Devinez que vous venez de manquer la méthode find dans les documents:

my_array.find {|e| e.satisfies_condition? }
13
répondu sepp2k 2010-03-04 17:13:58

Avez-vous besoin de l'objet lui-même ou avez-vous juste besoin de savoir si il y a est un objet qui satisfait. Si le premier 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 sera libéré sous caution avec "vrai" quand il trouve celui qui satisfait la condition. Le premier fera la même chose, mais retournera l'objet.

11
répondu Taryn East 2010-03-04 17:16:29