Ruby .ablehnen! vs .delete_if
Wird neu in Ruby, ich habe eine Frage über den Unterschied zwischen der .ablehnen! und .delete_if Methoden beim Umgang mit hashes und arrays. Wenn Sie nur wollen, um loszuwerden, bestimmte Objekte, ist es funktional keinen Unterschied zwischen den Methoden? Und der Grund für die Verwendung einer über den anderen?
Dank!
BEARBEITEN
Ich habe die Dokumentation gelesen...ich denke, ich hätte mehr klar in meiner ursprünglichen Frage. Ich wunderte mich mehr über die Unterschiede in der Effizienz. Funktionieren Sie anders, wie Sie Elemente löschen? (Wieder ignorieren return-Wert. Ich verstehe, dass ist ein Unterschied. Danke!)
- so hat
delete_if
- Haben Sie nicht versucht, das Lesen der Dokumentation? Es ist sehr explizit über dieses:
Hash#reject!
undArray#reject!
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Dokumentation ist ziemlich klar.
Der Unterschied ist, dass, wenn
reject!
nicht ändern, array, es gibtnil
.delete_if
wird wieder das array unverändert.["a"].delete_if{false}
gibt das array während["a"].reject!{false}
zurücknil
)reject
- erstellen Sie ein neues array ohne Elemente, und die Rückkehr der new arraydelete_if
- Elemente löschen, die übereinstimmung von aktuellen array und Rückgabe des arrayreject!
- Elemente löschen, die übereinstimmung von aktuellen array. Return array, wenn etwas abgelehnt wurde, odernil
wenn keine.reject
gibt immer ein Arrays, währenddelete_if
undreject!
gibt das ursprüngliche Objekt (das hätte ein Satz, zum Beispiel).tl;dr:
delete_if
scheint etwas schneller. Allerdings, die wichtigste überlegung bei der Wahl einer Methode wird der Unterschied in der Rückgabewert, wie schon in den anderen Antworten.Da Sie klargestellt, dass Ihre Frage ist, was die Effizienz betrifft, habe ich ein paar tests:
So, sieht aus wie, dass ab einer bestimmten Größe
delete_if
ist etwas schneller.time
ist definiert als:Die zahlen repräsentieren Benutzer-CPU-Zeit die system-CPU-Zeit, die Summe der user-und system-CPU-Zeit und die verstrichene Echtzeit, beziehungsweise. Finden Sie hier eine Erläuterung zu deren Bedeutung.
Beachten Sie, dass wie in jedem benchmark, YMMV, und Sie sollten test auf Ihre spezifischen workflows, anstatt meine erfundene Beispiel, entfernen von zahlen, die Vielfache von 5.