Warum brauchen manche Ruby-Methoden einen Knall und andere keine destruktive Methode?

8

Zum Beispiel benötigt array.pop keinen Knall, um das Array dauerhaft zu ändern. Warum ist das so und was war der Grund für die Entwicklung dieser bestimmten Ruby-Methoden ohne diese Konformität?

    
Aaron 13.08.2014, 18:15
quelle

4 Antworten

12

Bang-Methoden werden am häufigsten verwendet, um zwischen einer gefährlichen und einer sicheren Version derselben Methode zu unterscheiden. Hier sind einige Beispielfälle, die man mit einer Bang / No-Bang-Kombination unterscheiden könnte:

  • Mutator-Methoden - eine Version ändert das Objekt, die andere gibt eine Kopie zurück und belässt das ursprüngliche Objekt unverändert
  • wenn ein Fehler auftritt, löst eine Version eine Ausnahme aus, während die andere nur eine Fehlermeldung in das Protokoll schreibt oder nichts tut

Die Konvention besteht jedoch darin, den "Bang" zu verlassen, wenn es nur eine Version gibt, die Sinn macht. Zum Beispiel, pop in einem Array ohne tatsächlich zu ändern, macht keinen Sinn. In diesem Fall würde es sich um eine andere Operation handeln: Array#last . Viele Methoden ändern das Objekt, an dem sie aufgerufen werden, beispielsweise Setter. Wir müssen diese auch nicht mit einem Knall schreiben, weil es klar ist, dass sie das Objekt verändern.

Schließlich gibt es einige Ausnahmen, bei denen einige Entwickler eine Bang-Methode verwenden, ohne ein bangloses Gegenstück zu implementieren. In diesen Fällen wird der Knall einfach dazu verwendet, die Methodenaufrufe visuell hervorzuheben. Zum Beispiel:

  • Die Methode macht etwas Gefährliches oder Zerstörendes
  • Die Methode macht etwas unerwartetes
  • Die Methode hat erhebliche Auswirkungen auf die Performance
Patrick Oscity 13.08.2014, 18:21
quelle
2

Der Knall wird verwendet, um zwischen einer gefährlichen und weniger gefährlichen Version derselben Methode zu unterscheiden. Es gibt nur eine pop Methode, also gibt es nichts zu unterscheiden.

Hinweis: Der Name der Methode hat absolut nichts damit zu tun, was sie tut. Ob eine Methode destruktiv ist oder nicht, hängt davon ab, welchen Code sie ausführt und nicht, welchen Namen sie hat.

    
Jörg W Mittag 13.08.2014 19:52
quelle
1

Ein Suffix von ! bedeutet, dass eine Methode eine gefährliche Version einer anderen Methode ist. Zum Beispiel ist save! die gefährliche Version von save . "Gefährlich" kann bedeuten, dass die Bearbeitung an Ort und Stelle erfolgt und etwas mit strengeren Fehlern usw. durchgeführt wird. Es ist nicht erforderlich, das Suffix ! für eine gefährliche Methode zu verwenden, aber kein sichereres Gegenstück. Darüber hinaus ist dies nur eine Namenskonvention, daher beschränkt Ruby nicht das, was Sie tun können und was nicht, wenn eine Methode mit ! endet oder nicht.

Es gibt ein allgemeines Missverständnis, dass jede Methode, die etwas an Ort und Stelle bearbeitet, mit ! enden sollte. Dies ist nicht wahr, ! wird nur benötigt, wenn eine gefährlichere Version einer Methode existiert, die bereits existiert, und dies bedeutet nicht notwendigerweise, dass die gefährliche Methode bearbeitet wird. In Rails ist ActiveRecord::Base#save! beispielsweise eine Version von ActiveRecord::Base#save , die Validierungen durchführt.

    
Nick McCurdy 13.08.2014 18:18
quelle
1

Die Bedeutung von Bang in Ruby ist "Vorsicht". Es bedeutet, dass Sie die Methode mit Vorsicht verwenden sollten, nicht mehr. Ich kann die Referenz nicht mehr finden, aber die Autoritäten sagten ausdrücklich, dass diese Methode zerstörerisch sei. Bang ist nur ein semantisches Element, das mit Vorsicht assoziiert wird. Es liegt am Programmierer, alles einzumessen und zu entscheiden, wann er bang verwenden soll.

Zum Beispiel verwende ich in meinem Simulations-Juwel die Methode #step , um die Schrittweite zu erhalten.

%Vor%

und step! Methode, um den Simulationsschritt tatsächlich durchzuführen.

%Vor%

Aber wie für #reset Methode, entschied ich, dass das Wort "reset" es ist genug ausführlich und es ist nicht notwendig, bang zu verwenden, um den Benutzer zu warnen, dass der Simulationszustand zerstört wird:

%Vor%

PS .: Jetzt erinnere ich mich, es war einmal, Matz sagte halb scherzhaft, dass er es bereut, Methoden mit Knall in Ruby überhaupt einzuführen, weil Knall semantisch so zweideutig ist.

    
Boris Stitnicky 13.08.2014 18:36
quelle

Tags und Links