Est-ce que quelque chose me manque dans la documentation Array? J'ai un tableau qui contient jusqu'à un objet satisfaisant un certain critère. J'aimerais bien trouver 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: (1) cette sélection m'a obligé à parcourir tout le tableau, même si nous pouvions avoir échoué 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 avec la connaissance préalable qu'il y a 0 ou 1 objet satisfaisant.
Ce que j'aimerais, c'est quelque chose comme:
array.find_first(block)
-> répond à nil ou au premier objet pour lequel le bloc a la valeur true, mettant fin à la traversée de cet objet.
Dois-je écrire 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.
Merci d'avance, Dan
Soit je ne comprends pas votre question, soit Enumerable # find est la chose que vous cherchiez.
utilisez la méthode array detect
si vous voulez renvoyer 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 renvoyer toutes les valeurs pour lesquelles block renvoie 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 la documentation:
my_array.find {|e| e.satisfies_condition? }
Avez-vous besoin de l'objet lui-même ou avez-vous simplement besoin de savoir s'il existe est un objet qui satisfait. Si l'ancien, 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 va payer avec "vrai" quand il en trouve un qui satisfait à la condition. Le premier fera la même chose, mais retournera l'objet.