Was bedeutet der Fragezeichenoperator in Ruby?

211

Was ist der Zweck des Fragezeichenoperators in Ruby?

Manchmal sieht es so aus:

assert !product.valid?

manchmal ist es in einem ifKonstrukt.

Rtacconi
quelle
2
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.

chillitom
quelle
9
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.

Greg Osuri
quelle
29
In Ruby 1.9 wird es zurückkehren'F'
klew
39

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.

Eifion
quelle
28

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?"
Andy Gaskell
quelle
13
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.

Timo Geusch
quelle
41
answer.gsub! (/ function /, 'method')
Glenn Jackman
15

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?

Rich Smith
quelle
9

Ich glaube, es ist nur eine Konvention für Dinge, die boolesch sind. Ein bisschen wie " IsValid".

Neil Barnwell
quelle
1
prägnanter und großartiger Kommentar speziell "Ein bisschen wie" IsValid "
Kick Buttowski
2

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 .

José Joel.
quelle
0

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

jtzero
quelle
3
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".
Bfontaine