Vermisse ich etwas in der Array-Dokumentation? Ich habe ein Array, das bis zu einem Objekt enthält, das ein bestimmtes Kriterium erfüllt. Ich möchte dieses Objekt effizient finden. Die beste Idee, die ich aus den Dokumenten habe, ist folgende:
candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?
Aber ich bin aus zwei Gründen unzufrieden:
- Das
select
hat mich dazu gebracht, das ganze Array zu durchqueren, obwohl wir nach dem ersten Treffer hätten aussteigen können. - Ich brauchte eine Codezeile (mit einer Bedingung), um die Kandidaten zu reduzieren.
Beide Operationen sind verschwenderisch mit dem Vorwissen, dass es 0 oder 1 zufriedenstellende Objekte gibt.
Was ich möchte, ist so etwas wie:
array.find_first(block)
Dies gibt nil oder das erste Objekt zurück, für das der Block true ergibt, und beendet die Durchquerung an diesem Objekt.
Muss ich das selbst schreiben? All diese anderen großartigen Methoden in Array lassen mich denken, dass es da ist und ich sehe es einfach nicht.
quelle
[1,2,3,5,2].find { |n| puts n; n == 2 }
Iteration wird beendet, sobald das erste übereinstimmende Element gefunden wurde.Verwenden Sie die Array-
detect
Methode, wenn Sie den ersten Wert zurückgeben möchten, wobei block true zurückgibtWenn Sie alle Werte zurückgeben möchten, bei denen block true zurückgibt, verwenden Sie
select
quelle
.detect
ist genau das, was ich brauche. Aber was ist dann der Unterschied.find
?detect
ist nur ein Alias fürfind
ruby-doc.org/core-2.1.2/Enumerable.html#method-i-findVermutlich haben Sie gerade die Suchmethode in den Dokumenten verpasst:
quelle
my_array.find(&:satisfies_condition?)
Müssen Sie das Objekt selbst oder brauchen Sie nur zu wissen , ob es ist ein Objekt , das genügt. Wenn erstere dann ja: benutze find:
sonst kannst du verwenden
any?
Letzterer wird mit "wahr" auf Kaution gehen, wenn er eine findet, die die Bedingung erfüllt. Ersteres wird dasselbe tun, aber das Objekt zurückgeben.
quelle