Was ist der Zweck des Fragezeichenoperators in Ruby?
Manchmal sieht es so aus:
assert !product.valid?
manchmal ist es in einem if
Konstrukt.
Was ist der Zweck des Fragezeichenoperators in Ruby?
Manchmal sieht es so aus:
assert !product.valid?
manchmal ist es in einem if
Konstrukt.
Antworten:
Es ist eine Konvention im Codestil. Es gibt an, dass eine Methode einen booleschen Wert zurückgibt.
Das Fragezeichen ist ein gültiges Zeichen am Ende eines Methodennamens.
?
in Ruby (ist ein ternärer Operator, der ein Zeichen in seine ASCII-Ganzzahl konvertiert, Verwendung in test
, in RegEx'es usw.), von denen viele in den anderen Antworten hier behandelt werden.
isEmpty()
, isDigit()
usw. In Ruby, würde die gleichen Methoden geschrieben werden empty?
, und digit?
das ist ein bisschen IMO schöner.
is
ständig benutze . Dies könnte Super für jemand verwirrend sein von Swift , da die Marke Frage kommen wird verwendet für nullable
:)
Beachten Sie auch, dass ?
zusammen mit einem Zeichen der ASCII-Zeichencode für zurückgegeben wirdA
Beispielsweise:
?F # => will return 70
Alternativ können Sie in Ruby 1.8 Folgendes tun:
"F"[0]
oder in Rubin 1.9:
"F".ord
Beachten Sie auch, dass ?F
die Zeichenfolge zurückgegeben "F"
wird. Um den Code zu verkürzen, können Sie auch ?F.ord
Ruby 1.9 verwenden, um das gleiche Ergebnis wie zu erzielen "F".ord
.
'F'
In Ihrem Beispiel ist es nur ein Teil des Methodennamens. In Ruby können Sie auch Ausrufezeichen in Methodennamen verwenden!
Ein weiteres Beispiel für Fragezeichen in Ruby wäre der ternäre Operator.
customerName == "Fred" ? "Hello Fred" : "Who are you?"
In deinem Beispiel
product.valid?
Ist eigentlich ein Funktionsaufruf und ruft eine Funktion namens auf valid?
. Bestimmte Arten von "Test for Condition" / Booleschen Funktionen haben gemäß Konvention ein Fragezeichen als Teil des Funktionsnamens.
Es kann erwähnenswert sein, dass ?
s nur in Methodennamen und nicht in Variablen zulässig sind. Beim Erlernen von Ruby nahm ich an, dass ?
ein boolescher Rückgabetyp festgelegt wurde, und versuchte, sie zu Flag-Variablen hinzuzufügen, was zu Fehlern führte. Dies führte dazu, dass ich fälschlicherweise eine Weile glaubte, dass es eine spezielle Syntax für ?
s gab.
Relevant: Warum kann ein Variablenname nicht mit "" enden, während ein Methodenname dies kann?
Ich glaube, es ist nur eine Konvention für Dinge, die boolesch sind. Ein bisschen wie " IsValid
".
Es wird auch in regulären Ausdrücken verwendet, was "höchstens eine Wiederholung des vorhergehenden Zeichens" bedeutet.
Beispielsweise /hey?/
stimmt der reguläre Ausdruck mit den Zeichenfolgen " he
" und " hey
" überein .
Es ist auch eine übliche Konvention, die mit dem ersten Argument der Testmethode aus Kernel # test verwendet wird
irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true
wie in dieser Frage hier zu sehen
test
, ?d
ist eine Abkürzung für "d"
. test
Nimmt eine Zeichenfolge mit einem Zeichen als erstes Argument, sodass Sie sie mit test ?d, "/dev"
oder aufrufen können test "d", "/dev"
.