Ist "find_all" und "select" dasselbe?
Diese beiden Aussagen geben mir die gleichen Ergebnisse:
[1,2,3,4].find_all { |x| x.even? }
[1,2,3,4].select{ |x| x.even? }
Ist find_all
nur ein alias? Gibt es einen Grund für die Verwendung einer über dem anderen?
InformationsquelleAutor der Frage ek_ny | 2014-01-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
#find_all
und#select
sind sehr ähnlich, der Unterschied ist sehr subtil. In den meisten Fällen, Sie sind gleichwertig. Es hängt von der Klasse die Umsetzung.Enumerable#find_all
undEnumerable#select
auf dem gleichen code.Das gleiche passiert, für
Array
undRange
wie SieEnumerable
Umsetzung.Im Fall von
Hash
#select
neu definiert wird, um wieder eine Hash statt Array, aber#find_all
ist geerbt vonEnumerable
InformationsquelleAutor der Antwort wacko
Enumerable#find_all
Gibt ein array mit allen Elementen von enum, für die der block gibt den Wert true zurückdas ist nicht der Fall fürselect
.Enumerable#select
gibt dieArray
wenn der Empfänger auf den Sie anrufen#select
Methode, die nicht über einen eigenen#select
Methode. Ansonsten auf die Empfänger, die Sie anrufen#select
Methode, wird es wieder eine ähnliche Art des Receivers nach der Bearbeitung der block-Bedingung.Wie
Hash#select
Gibt ein neues hash, bestehend aus Eingaben, für die der block zurücktrue
undArray#select
Gibt ein neues array zurück, das alle Elemente von G, für die der block gibt den Wert true zurück. JetztRange#select
geben Sie zurück einArray
alsRange
- Klasse nicht über eine eigene Instanz-Methode aufgerufen#select
. Eher einEnumerable
es rufenEnumerable#select
.Hier ist eine volle Demo mit Beispiel-zugunsten meiner Erklärung oben :
InformationsquelleAutor der Antwort Arup Rakshit
Ja, für Arrays, liefern Sie identische Ergebnisse. Für andere Dinge (z.B. Hashes), Sie zurückkehren können verschiedene Dinge.
Entsprechend der Enumerable-Dokumentation für wählen Sie und find_allbeide Methoden auf den gleichen source-code, und beide wieder entweder ein Array (wenn ein block gegeben ist) oder ein Enumerator (wenn kein block gegeben ist).
Während die Array-Klasse implementiert eine eigene version von
select
(aber können Zählbare Grifffind_all
), Sie immer noch das gleiche tun.InformationsquelleAutor der Antwort Dylan Markow