Das Fragezeichen am Ende einer Funktion ist kein Operator, sondern ein gewöhnliches Zeichen. Das Fragezeichen zusammen mit dem Doppelpunkt ist ein ternärer bedingter Operator. Das Fragezeichen an sich ist ein unärer Anführungszeichenoperator. Siehe stackoverflow.com/questions/16641205/…
Old Pro
Antworten:
296
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.
Danke, aber bedeutet diese Konvention nur die Logik oder könnten Nebenwirkungen auftreten? Komisch, wie dies eine Art Hack um eine getippte Sprache mit dem Rückgabetyp im Code ist.
Jason
5
In diesem Fall handelt es sich ausschließlich um eine Methodennamenskonvention. Es gibt keine Durchsetzung eines booleschen Rückgabewerts. Nur weil die Methodennamen Ende in einem Fragezeichen bedeuten nicht , dass das Verfahren muss eine boolean zurückgeben ... aber es definitiv sollte einen boolean zurück. Es gibt jedoch mehrere andere Verwendungen von ?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.
Karl Wilbur
4
@ Jason FYI, auch stark typisierte Sprachen haben Konventionen wie diese. Zum Beispiel in Java - Methoden , die einen Booleschen Wert zurückgeben , werden oft mit dem Präfix „ist“, wie in isEmpty(), isDigit()usw. In Ruby, würde die gleichen Methoden geschrieben werden empty?, und digit?das ist ein bisschen IMO schöner.
Ajedi32
3
Ajedi32 - Ja, ich stimme zu, es ist schön, solche Funktionen zu benennen, die ich isständig benutze . Dies könnte Super für jemand verwirrend sein von Swift , da die Marke Frage kommen wird verwendet für nullable:)
Jason
83
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 ?Fdie Zeichenfolge zurückgegeben "F"wird. Um den Code zu verkürzen, können Sie auch ?F.ordRuby 1.9 verwenden, um das gleiche Ergebnis wie zu erzielen "F".ord.
Um Andys Antwort zu erweitern, sehen Sie auch Dinge wie: customerName == user.logged_in? ? user.name: "Wer bist du?" Beachten Sie das doppelte Fragezeichen
Fragezeichen
16
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.
Es ist nicht verwandt mit test, ?dist eine Abkürzung für "d". testNimmt eine Zeichenfolge mit einem Zeichen als erstes Argument, sodass Sie sie mit test ?d, "/dev"oder aufrufen können test "d", "/dev".
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.
quelle
?
in Ruby (ist ein ternärer Operator, der ein Zeichen in seine ASCII-Ganzzahl konvertiert, Verwendung intest
, 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 werdenempty?
, unddigit?
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ürnullable
:)Beachten Sie auch, dass
?
zusammen mit einem Zeichen der ASCII-Zeichencode für zurückgegeben wirdA
Beispielsweise:
Alternativ können Sie in Ruby 1.8 Folgendes tun:
oder in Rubin 1.9:
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
.quelle
'F'
Es ist eine Konvention in Ruby, dass Methoden, die boolesche Werte zurückgeben, mit einem Fragezeichen enden. Es gibt keine größere Bedeutung als das.
quelle
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.
quelle
In deinem Beispiel
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.quelle
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?
quelle
Ich glaube, es ist nur eine Konvention für Dinge, die boolesch sind. Ein bisschen wie "
IsValid
".quelle
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 .quelle
Es ist auch eine übliche Konvention, die mit dem ersten Argument der Testmethode aus Kernel # test verwendet wird
wie in dieser Frage hier zu sehen
quelle
test
,?d
ist eine Abkürzung für"d"
.test
Nimmt eine Zeichenfolge mit einem Zeichen als erstes Argument, sodass Sie sie mittest ?d, "/dev"
oder aufrufen könnentest "d", "/dev"
.