Frage

In Ruby haben einige Methoden ein Fragezeichen (?), die eine Frage wie include? stellen, wenn das Objekt in Frage enthalten ist, dies dann ein wahr / falsch zurück.

Aber warum einige Methoden haben Ausrufezeichen (!), wo andere nicht?

Was ist das?

War es hilfreich?

Lösung

Im allgemeinen Methode, die in ! Ende zeigt, dass die Methode ändern Sie das Objekt, um es auf genannt wird. Ruby nennt diese als „ gefährliche Methoden “, weil sie ihren Zustand ändern, dass jemand anderes einen Verweis auf haben könnte. Hier ist ein einfaches Beispiel für Strings:

foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

Dies wird ausgegeben:

a string

In den Standardbibliotheken gibt es viele Orte, die Sie Paare von ähnlich benannten Methoden sehen werden, eine mit dem ! und eine ohne. Die, die ohne „sichere Methoden“ genannt werden, und sie geben eine Kopie des Originals mit Änderungen angewandt die Kopie , mit dem Angerufenen unverändert. Hier ist das gleiche Beispiel ohne die !:

foo = "A STRING"    # a string called foo
bar = foo.downcase  # doesn't modify foo; returns a modified string
puts foo            # prints unchanged foo
puts bar            # prints newly created bar

Diese Ausgänge:

A STRING
a string

Beachten Sie dies ist nur eine Konvention, aber eine Menge von Ruby-Klassen folgen. Es hilft auch, halten Sie verfolgen, was in Ihrem Code geändert wird immer.

Andere Tipps

Das Ausrufezeichen bedeutet, dass viele Dinge, und manchmal kann man nicht viel von ihm anders als „das ist gefährlich, seien Sie vorsichtig“.

sagen

Wie bereits gesagt wurde, in Standardmethoden verwendet, es ist oft eine Methode, um anzuzeigen, dass ein Objekt bewirkt, dass sich mutieren, aber nicht immer. Beachten Sie, dass viele Standard-Methoden, um ihren Empfänger ändern und haben nicht ein Ausrufezeichen (pop, shift, clear) und einige Methoden mit Ausrufungszeichen nicht ändern ihre Empfänger (exit!). Siehe diesen Artikel zum Beispiel.

Weitere Bibliotheken kann es anders verwenden. In Rails bedeutet ein Ausrufezeichen oft, dass die Methode eine Ausnahme bei einem Fehler werfen, anstatt still versagen.

Es ist eine Namenskonvention, aber viele Menschen nutzen es in subtil unterschiedliche Weise. In Ihrem eigenen Code des Daumens eine gute Regel ist, es zu benutzen, wenn eine Methode etwas „gefährlich“ tut, vor allem, wenn zwei Methoden mit dem gleichen Namen vorhanden ist und einer von ihnen ist mehr „gefährlich“ als die andere. "Dangerous" kann zwar fast alles bedeuten.

Diese Namenskonvention ist von Scheme angehoben.

  

1.3.5 Regeln für die Namensgebung

     

Nach Konvention werden die Namen der Verfahren   dass immer einen Booleschen Wert zurück   Ende in der Regel in ``? ''. Solche Verfahren   sind Prädikate genannt.

     

Nach Konvention werden die Namen der Verfahren   dass die Speicherung von Werten in zuvor   zugeordneten Stellen (siehe Abschnitt 3.4)   Ende in der Regel in ``! ''. Solche Verfahren   sind Mutationsverfahren genannt. Durch   Convention, der Wert von a zurück   Mutation Verfahren ist nicht spezifiziert.

! typischerweise bedeutet, dass das Verfahren auf das Objekt wirkt stattdessen eine Folge zurückzugeben. Aus dem Buch Programmierung in Ruby :

  

Methoden, die „gefährlich“ oder ändern Sie den Empfänger sind, können mit einem nachgestellten benannt werden „!“.

Von themomorohoax.com:

Ein Knall in der unten angegebenen Weise verwendet kann, um meine persönlichen Präferenz.

  

1) Eine aktive Aufzeichnung Methode löst einen Fehler, wenn das Verfahren nicht tut,   was es heißt, es wird.

     

2) eine aktive Datensatz Methode speichert den Datensatz oder ein Verfahren spart   Objekt (z Streifen!)

     

3) Ein Verfahren, tut etwas „extra“, wie Beiträge zu irgendwo, oder tut   eine Aktion.

Der Punkt ist: nur einen Knall verwenden, wenn Sie wirklich darüber nachgedacht habe, ob ist es notwendig, andere Entwickler, um den Ärger zu sparen des Habens prüfen, warum Sie einen Knall verwenden.

Der Knall liefert zwei Signale an andere Entwickler.

  

1), dass es nicht notwendig ist, um das Objekt zu speichern, nachdem der Aufruf   Verfahren.

     

2), wenn Sie die Methode aufrufen, wird die db geändert werden.

http: // www .themomorohoax.com / 2009/02/11 / when-to-use-a-Bang-Ausruf-Punkt-after-Schienen-Methoden

Es ist sehr genau zu sagen, dass Methoden mit einem Knall! sind die mehr gefährlich oder überraschend Version. Es gibt viele Methoden, die ohne Bang mutieren wie .destroy und im allgemeinen Methode nur Pony, wo eine sicherere Alternative im lib Kern vorhanden ist.

Zum Beispiel auf Array wir .compact und .compact! haben, mutieren beide Methoden das Array, aber .compact! gibt nil zurück, statt selbst wenn es keine Null ist in der Anordnung sind, was noch überraschender ist, als nur sich selbst zurückkehrt.

Die einzige nicht-mutierende Methode, die ich mit einem Knall gefunden habe, ist Kernel die .exit! , die so überraschender als .exit ist, weil Sie nicht SystemExit, während der Prozess Schließen fangen können.

Rails und Active setzt diesen Trend fort, dass es Knall für mehr ‚überraschende‘ Effekte wie .create! verwendet, die auf Fehler wirft Versagen.

Einfache Erklärung:

foo = "BEST DAY EVER" #assign a string to variable foo.

=> foo.downcase #call method downcase, this is without any exclamation.

"best day ever"  #returns the result in downcase, but no change in value of foo.

=> foo #call the variable foo now.

"BEST DAY EVER" #variable is unchanged.

=> foo.downcase! #call destructive version.

=> foo #call the variable foo now.

"best day ever" #variable has been mutated in place.

Aber wenn Sie jemals eine Methode downcase! in der Erklärung oben genannt, foo ändern würde dauerhaft downcase. downcase! würde kein neues String-Objekt zurück, aber die Zeichenfolge im Ort ersetzen, völlig die foo Wechsel zu downcase. Ich schlage vor, Sie nicht downcase! verwenden, wenn es absolut notwendig ist.

!

Ich mag dies als eine explosive Veränderung denken, dass alle zerstört, die, bevor sie gegangen ist. Bang oder Ausrufezeichen bedeutet, dass Sie eine permanente gespeicherte Änderung im Code machen.

Wenn Sie zum Beispiel Ruby-Methode für die globale substitutiongsub!the Substitution verwenden Sie machen, ist dauerhaft.

Eine weitere Möglichkeit, es sich vorstellen können, ist eine Textdatei zu öffnen und finden Sie tun und ersetzen, gefolgt von Speichern. ! tut das gleiche in Ihrem Code.

Eine weitere nützliche Erinnerung daran, wenn Sie aus der bash Welt gekommen ist sed -i diese ähnliche Wirkung hat permanent gespeichert Wechsel zu machen.

Called „Destructive Methods“ Sie neigen dazu, die ursprüngliche Kopie des Objekts zu ändern, um die Sie sich beziehen.

numbers=[1,0,10,5,8]
numbers.collect{|n| puts n*2} # would multiply each number by two
numbers #returns the same original copy
numbers.collect!{|n| puts n*2} # would multiply each number by two and destructs the original copy from the array
numbers   # returns [nil,nil,nil,nil,nil]

Fazit: ! Methoden nur den Wert des Objekts verändern sie aufgefordert werden, während ein Verfahren ohne ! einen manipulierten Wert zurückgibt, ohne das Objekt zu schreiben über die Methode aufgerufen wurde.

Nur ! verwenden, wenn Sie auf die Variable nicht planen Sie auf die Methode aufgerufen gespeichert, um den ursprünglichen Wert auf benötigen.

Ich ziehe es etwas zu tun:

foo = "word"
bar = foo.capitalize
puts bar

oder

foo = "word"
puts foo.capitalize

Anstelle von

foo = "word"
foo.capitalize!
puts foo

Für den Fall, würde Ich mag wieder den ursprünglichen Wert zuzugreifen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top