it-swarm-eu.dev

Was ist der Zweck von "!" und "?" am Ende der Methodennamen?

Manchmal sehe ich in Ruby Methoden, die "?" und "!" am Ende von ihnen, z.

name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?

Ich habe mich gefragt, was ihr Zweck ist. Sind sie nur Syntax-Zuckerguss?

88
itsaboutcode

Es ist "nur Zuckerguss" für die Lesbarkeit, aber sie haben gemeinsame Bedeutungen:

  • Methoden, die auf ! enden, führen eine permanente oder möglicherweise gefährliche Änderung durch ; zum Beispiel:
    • Enumerable#sort gibt eine sortierte Version des Objekts zurück, während Enumerable#sort! es an Ort und Stelle sortiert.
    • In Rails gibt ActiveRecord::Base#save den Wert false zurück, wenn das Speichern fehlgeschlagen ist, während ActiveRecord::Base#save! eine Ausnahme auslöst.
    • Kernel::exit bewirkt, dass ein Skript beendet wird, während Kernel::exit! dies sofort tut und alle Exit-Handler umgeht.
  • Methoden, die auf ? enden, geben einen booleschen Wert zurück , wodurch der Code-Fluss noch intuitiver wird wie ein Satz - if number.zero? liest sich wie "wenn die Zahl Null ist", aber if number.zero sieht einfach komisch aus.

In Ihrem Beispiel wird name.reverse zu einer umgekehrten Zeichenfolge ausgewertet, aber erst nach der Zeile name.reverse! ist die Variable name tatsächlich include der umgekehrte Name. name.is_binary_data? sieht aus wie "sind name Binärdaten?".

146
jtbandes

Fragezeichen zeigt an, dass die Methode boolean zurückgibt. Bereits hier beantwortet:

Was bedeutet der Fragezeichen-Operator in Ruby?

Der Knall zeigt an, dass die Methode auf das Objekt selbst wirkt. Bereits hier beantwortet:

Warum werden in Ruby-Methoden Ausrufezeichen verwendet?

13
Bill

In Ruby bedeutet ?, dass die Methode einen Boolean-Wert zurückgibt und ! das Objekt ändert, für das sie aufgerufen wurde. Sie dienen dazu, die Lesbarkeit beim Betrachten des Codes zu verbessern.

7
J Lundberg

Im Gegensatz zu der - ich glaube - Mehrheit der Programmiersprachen ...

Ruby, Methoden dürfen mit Fragezeichen oder Ausrufezeichen enden. 

Standardmäßig enden Methoden, die Fragen beantworten (d. H. Array # empty? Gibt true zurück, wenn der Empfänger leer ist) in Fragezeichen. 

Potentiell "gefährliche" Methoden (dh Methoden, die sich selbst oder die Argumente ändern, beenden! Usw.) enden konventionell mit Ausrufezeichen.

Von: http://www.Ruby-lang.org/de/documentation/Ruby-from-other-languages/ , Abschnitt Lustige Methodennamen

5
miku

Vorsicht, das ist nicht immer der Fall. Nehmen Sie zum Beispiel Ruby Array # concat http://docs.Ruby-lang.org/de/2.0.0/Array.html#method-i-concat

Wo man sich schlecht verbrennen kann, ist so etwas wie MyActiveRecordModel.column_names.concat([url]). Spätere Aufrufe, die sich auf MyActiveRecordModel beziehen, versuchen, nach einer Spalte mit 'url' für MyActiveRecordModel und throw zu suchen. 

Stattdessen müssen Sie es vor dem Concat klonen. Zum Glück hat meine Testsuite dieses gefangen, aber ... auf geht's!

0
wintondeshong