In Ruby haben einige Methoden ein Fragezeichen ( ?
), das eine solche include?
Frage stellt. Wenn das betreffende Objekt enthalten ist, wird ein true / false zurückgegeben.
Aber warum haben einige Methoden Ausrufezeichen ( !
), andere nicht?
Was bedeutet das?
Antworten:
Im Allgemeinen geben Methoden, die mit enden, an
!
, dass die Methode das Objekt ändert, für das sie aufgerufen wird . Ruby nennt diese " gefährliche Methoden ", weil sie den Status ändern, auf den möglicherweise jemand anderes verweist. Hier ist ein einfaches Beispiel für Zeichenfolgen:Dies wird Folgendes ausgeben:
In den Standardbibliotheken gibt es viele Stellen, an denen Paare von Methoden mit ähnlichen Namen angezeigt werden, eine mit
!
und eine ohne. Diejenigen ohne werden als "sichere Methoden" bezeichnet und geben eine Kopie des Originals mit Änderungen an der Kopie zurück , wobei der Angerufene unverändert bleibt. Hier ist das gleiche Beispiel ohne!
:Dies gibt aus:
Denken Sie daran, dass dies nur eine Konvention ist, aber viele Ruby-Klassen folgen ihr. Es hilft Ihnen auch zu verfolgen, was in Ihrem Code geändert wird.
quelle
save
save!
ActiveRecord
Das Ausrufezeichen bedeutet viele Dinge, und manchmal kann man nicht viel davon sagen, außer "das ist gefährlich, sei vorsichtig".
Wie andere gesagt haben, wird es in Standardmethoden häufig verwendet, um eine Methode anzugeben, die bewirkt, dass sich ein Objekt selbst mutiert, jedoch nicht immer. Beachten Sie, dass viele Standard - Methoden , um ihren Empfänger ändern und stellen nicht ein Ausrufezeichen haben (
pop
,shift
,clear
) und einige Methoden mit Ausrufungszeichen nicht ihren Empfänger nicht ändern (exit!
). Siehe diesen Artikel zum Beispiel.Andere Bibliotheken verwenden es möglicherweise anders. In Rails bedeutet ein Ausrufezeichen häufig, dass die Methode bei einem Fehler eine Ausnahme auslöst, anstatt stillschweigend fehlzuschlagen.
Es ist eine Namenskonvention, aber viele Leute verwenden sie auf subtil unterschiedliche Weise. In Ihrem eigenen Code ist es eine gute Faustregel, ihn immer dann zu verwenden, wenn eine Methode etwas "Gefährliches" tut, insbesondere wenn zwei Methoden mit demselben Namen existieren und eine davon "gefährlicher" als die andere ist. "Gefährlich" kann jedoch fast alles bedeuten.
quelle
Diese Namenskonvention wird aus dem Schema gestrichen .
quelle
! In der Regel bedeutet dies, dass die Methode auf das Objekt einwirkt, anstatt ein Ergebnis zurückzugeben. Aus dem Buch Programming Ruby :
quelle
Es ist am genauesten zu sagen, dass Methoden mit einem Knall! sind die gefährlichere oder überraschendere Version. Es gibt viele Methoden, die ohne einen Knall mutieren, wie
.destroy
und im Allgemeinen haben Methoden nur Pony, wo eine sicherere Alternative in der Kernbibliothek existiert.Zum Beispiel haben wir auf Array
.compact
und.compact!
, beide Methoden mutieren das Array, geben aber.compact!
nil anstelle von self zurück, wenn das Array keine nil enthält, was überraschender ist, als nur self zurückzugeben.Die einzige nicht mutierende Methode, die ich mit einem Knall gefunden habe, ist die
Kernel
,.exit!
die überraschender ist, als.exit
weil Sie nicht fangen können,SystemExit
während der Prozess geschlossen wird.Rails und ActiveRecord setzen diesen Trend fort, indem sie Bang für "überraschendere" Effekte verwenden
.create!
, die Fehler bei Fehlern verursachen.quelle
Von themomorohoax.com:
Ein Knall kann in der Reihenfolge meiner persönlichen Vorlieben auf die folgenden Arten verwendet werden.
Der Punkt ist: Verwenden Sie einen Knall nur, wenn Sie wirklich darüber nachgedacht haben, ob dies notwendig ist, um anderen Entwicklern den Ärger zu ersparen, überprüfen zu müssen, warum Sie einen Knall verwenden.
Der Knall bietet anderen Entwicklern zwei Hinweise.
http://www.themomorohoax.com/2009/02/11/when-to-use-a-bang-exclamation-point-after-rails-methods
quelle
Einfache Erklärung:
Wenn Sie jedoch jemals eine Methode
downcase!
in der obigen Erklärung aufgerufen haben ,foo
würde sich diese dauerhaft in einen Kleinbuchstaben ändern.downcase!
würde kein neues Zeichenfolgenobjekt zurückgeben, sondern die vorhandene Zeichenfolge ersetzen und dasfoo
in Großbuchstaben ändern. Ich schlage vor, Sie verwendendowncase!
nicht, es sei denn, es ist absolut notwendig.quelle
Ich stelle mir das gerne als eine explosive Veränderung vor, die alles zerstört, was vorher gegangen ist. Ein Knall oder ein Ausrufezeichen bedeutet, dass Sie eine dauerhaft gespeicherte Änderung in Ihrem Code vornehmen.
Wenn Sie beispielsweise Rubys Methode für die globale Substitution verwenden, ist
gsub!
die von Ihnen vorgenommene Substitution dauerhaft.Eine andere Möglichkeit, die Sie sich vorstellen können, besteht darin, eine Textdatei zu öffnen, zu suchen und zu ersetzen und anschließend zu speichern.
!
macht das gleiche in Ihrem Code.Eine weitere nützliche Erinnerung, wenn Sie aus der Bash-Welt kommen, ist
sed -i
der ähnliche Effekt, dass Sie dauerhaft gespeicherte Änderungen vornehmen.quelle
Als "destruktive Methoden" bezeichnet Sie ändern in der Regel die Originalkopie des Objekts, auf das Sie sich beziehen.
quelle
Fazit:
!
Methoden ändern nur den Wert des Objekts, für das sie aufgerufen werden, während eine Methode ohne!
einen manipulierten Wert zurückgibt, ohne über das Objekt zu schreiben, für das die Methode aufgerufen wurde.Nur verwenden,
!
wenn Sie nicht vorhaben, den ursprünglichen Wert zu benötigen, der in der Variablen gespeichert ist, für die Sie die Methode aufgerufen haben.Ich mache lieber so etwas wie:
ODER
Anstatt
Nur für den Fall, dass ich wieder auf den ursprünglichen Wert zugreifen möchte.
quelle
!
mutiert das Objekt, anstatt eine geänderte Kopie zurückzugeben.User.create!