Ruby Array object find_first?

Est-ce que je manque quelque chose dans la documentation Array? J’ai un tableau qui contient jusqu’à un object satisfaisant un certain critère. J’aimerais trouver cet object efficacement. 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 ne suis pas satisfait pour deux raisons: (1) cette sélection m’a fait parcourir l’ensemble du 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 un gaspillage de connaissance préalable: il y a 0 ou 1 object satisfaisant.

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

array.find_first(block) -> answers nil ou le premier object pour lequel le bloc est évalué à true, mettant fin à la traversée sur cet object.

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

Merci d’avance, Dan

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

utiliser la méthode de detect tableau si vous voulez retourner la première valeur où le bloc 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 retourne true, utilisez select

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

Je suppose que vous venez de manquer la méthode de recherche dans les documents:

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

Avez-vous besoin de l’object lui-même ou avez-vous simplement besoin de savoir s’il existe un object qui satisfait. Si l’ancien est oui, utilisez:

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

sinon vous pouvez en utiliser any?

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

Ce dernier cautera “vrai” quand il en trouvera un qui satisfera à la condition. Le premier fera la même chose, mais renverra l’object.