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.


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.


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.


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.


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?"

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.


41
answer.gsub! (/ function /, 'method')
Glenn Jackman


9

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


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 .


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.