Manchmal sehe ich in Ruby Methoden, die "?" und "!" am Ende von ihnen, zB:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Ich habe mich gefragt, was ihr Zweck ist? Sind sie nur Syntaxzuckerbeschichtung?
Manchmal sehe ich in Ruby Methoden, die "?" und "!" am Ende von ihnen, zB:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Ich habe mich gefragt, was ihr Zweck ist? Sind sie nur Syntaxzuckerbeschichtung?
Antworten:
Es ist "nur Zuckerüberzug" für die Lesbarkeit, aber sie haben gemeinsame Bedeutungen:
!
die mit einer dauerhaften oder potenziell gefährlichen Änderung enden ; beispielsweise:
Enumerable#sort
Gibt eine sortierte Version des Objekts zurück, während Enumerable#sort!
es an Ort und Stelle sortiert wird.ActiveRecord::Base#save
false zurück, wenn das Speichern fehlgeschlagen ist, während ActiveRecord::Base#save!
eine Ausnahme ausgelöst wird.Kernel::exit
bewirkt, dass ein Skript Kernel::exit!
sofort beendet wird, wobei alle Exit-Handler umgangen werden.?
einem Booleschen Wert enden , lassen den Code noch intuitiver wie ein Satz fließen - if number.zero?
lesen sich wie "wenn die Zahl Null ist", sehen aber if number.zero
nur seltsam aus.In Ihrem Beispiel name.reverse
auswertet , um eine umgekehrte Zeichenfolge, aber erst nach der name.reverse!
Linie funktioniert das name
Variable tatsächlich enthält die Reversed Namen. name.is_binary_data?
sieht aus wie "ist name
Binärdaten?".
Array#clear
zum Beispiel. Es löscht das Array. Das Löschen des Arrays mutiert es natürlich. Das ist nicht überraschend, der Name macht es schon klar: kein Knall. Siehe ruby-forum.com/topic/176830#773946 .
Ein Fragezeichen zeigt an, dass die Methode einen Booleschen Wert zurückgibt. Hier bereits beantwortet:
Was bedeutet der Fragezeichenoperator in Ruby?
Der Knall zeigt an, dass die Methode auf das Objekt selbst einwirkt. Hier bereits beantwortet:
In Ruby ?
bedeutet dies, dass die Methode einen Booleschen !
Wert zurückgibt und das Objekt ändert, für das sie aufgerufen wurde. Sie dienen dazu, die Lesbarkeit beim Betrachten des Codes zu verbessern.
Im Gegensatz zu der - ich nehme an - Mehrheit der Programmiersprachen ...
Ruby, Methoden dürfen mit Fragezeichen oder Ausrufezeichen enden.
Konventionell enden Methoden, die Fragen beantworten (dh Array # leer? Gibt true zurück, wenn der Empfänger leer ist), in Fragezeichen.
Potenziell „gefährliche“ Methoden (dh Methoden, die sich selbst oder die Argumente ändern, beenden! Usw.) enden konventionell mit Ausrufezeichen.
Von: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , Abschnitt Lustige Methodennamen
?
werden Prädikatmethoden genannt.
Achtung, das ist nicht immer der Fall. Nehmen Sie zum Beispiel Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .
Wo man sich schwer verbrennen kann, ist so etwas wie MyActiveRecordModel.column_names.concat([url])
. Spätere Aufrufe im Zusammenhang mit MyActiveRecordModel versuchen, nach einer Spalte mit 'url' für MyActiveRecordModel zu suchen und zu werfen.
Stattdessen müssen Sie es klonen, bevor Sie den Concat ausführen. Zum Glück hat meine Testsuite diese gefangen, aber ... Kopf hoch!