Est-ce que je manque quelque chose dans la documentation Array? 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 de la documentation 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:
- Cela
select
m'a fait parcourir tout le tableau, même si nous aurions pu renflouer après le premier coup. - 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 objet satisfaisant.
Ce que je voudrais, c'est quelque chose comme:
array.find_first(block)
qui renvoie nil ou le premier objet pour lequel le bloc est évalué à vrai, mettant fin au parcours à cet objet.
Dois-je écrire cela moi-même? Toutes ces autres méthodes géniales dans Array me font penser que c'est là et je ne le vois tout simplement pas.
la source
[1,2,3,5,2].find { |n| puts n; n == 2 }
itération s'arrête une fois qu'il trouve le premier élément auquel il correspond.utilisez la
detect
méthode de tableau si vous voulez retourner la première valeur où le bloc retourne vraiSi vous souhaitez renvoyer toutes les valeurs où block retourne true, utilisez
select
la source
.detect
est exactement ce dont j'ai besoin. Mais quelle est la différence avec.find
alors?detect
est juste un alias defind
ruby-doc.org/core-2.1.2/Enumerable.html#method-i-findJe suppose que vous venez de manquer la méthode de recherche dans la documentation:
la source
my_array.find(&:satisfies_condition?)
Est - ce que vous avez besoin de l'objet lui - même ou avez - vous juste besoin de savoir s'il est un objet qui satisfait. Si le premier alors oui: utilisez find:
sinon vous pouvez utiliser
any?
Ce dernier renoncera à "vrai" lorsqu'il en trouvera un qui satisfait à la condition. Le premier fera de même, mais retournera l'objet.
la source