Que signifie l'opérateur de point d'interrogation dans Ruby?

211

Quel est le but de l'opérateur de point d'interrogation dans Ruby?

Parfois, cela apparaît comme ceci:

assert !product.valid?

parfois c'est dans une ifconstruction.

rtacconi
la source
2
Le point d'interrogation à la fin d'une fonction n'est pas un opérateur, c'est un caractère ordinaire. Le point d'interrogation avec deux points est un opérateur conditionnel ternaire. Le point d'interrogation est en soi un opérateur de citation unaire. Voir stackoverflow.com/questions/16641205/…
Old Pro

Réponses:

296

Il s'agit d'une convention de style de code; il indique qu'une méthode renvoie une valeur booléenne.

Le point d'interrogation est un caractère valide à la fin d'un nom de méthode.

chillitom
la source
9
Merci, mais cette convention signifie-t-elle qu'elle ne fait que la logique ou pourrait-il y avoir des effets secondaires? C'est drôle comme c'est une sorte de hack autour d'une langue tapée avec le type de retour dans le code.
Jason
5
Dans ce cas, il s'agit strictement d'une convention de dénomination de méthode. Il n'y a pas d'application d'une valeur de retour booléenne. Ce n'est pas parce que le nom de la méthode se termine par un point d'interrogation que la méthode doit renvoyer un booléen ... mais elle doit certainement renvoyer un booléen. Cependant, il existe plusieurs autres utilisations de ?Ruby (est un opérateur ternaire, convertissant un caractère en son entier ASCII, utilisation dans test, dans RegEx'es, etc.), dont beaucoup sont couverts dans les autres réponses ici.
Karl Wilbur
4
@Jason FYI, même les langues fortement typées ont des conventions comme celle-ci. Par exemple, dans les méthodes Java qui renvoient une valeur booléenne sont souvent préfixées « est », comme isEmpty(), isDigit(), etc. Ruby, les mêmes méthodes serait écrit empty?et digit?qui est tout à fait un peu mieux l' OMI.
Ajedi32
3
Ajedi32 - Oui, je suis d'accord, c'est bien de nommer des fonctions comme ça, j'utilise istout le temps. Cela pourrait être super déroutant pour quelqu'un qui vient de Swift puisque la marque de question , il est utilisé pour nullable:)
Jason
83

Notez également ?avec un caractère, retournera le code de caractère ASCII pourA

Par exemple:

?F # => will return 70

Alternativement dans ruby ​​1.8, vous pouvez faire:

"F"[0]

ou en rubis 1.9:

"F".ord

Notez également que ?Fretournera la chaîne "F", donc afin de raccourcir le code, vous pouvez également utiliser ?F.orddans Ruby 1.9 pour obtenir le même résultat que "F".ord.

Greg Osuri
la source
29
Dans ruby ​​1.9, il reviendra'F'
klew
39

C'est une convention dans Ruby que les méthodes qui renvoient des valeurs booléennes se terminent par un point d'interrogation. Il n'y a pas plus d'importance que cela.

Eifion
la source
28

Dans votre exemple, cela fait simplement partie du nom de la méthode. Dans Ruby, vous pouvez également utiliser des points d'exclamation dans les noms de méthode!

Un autre exemple de points d'interrogation dans Ruby serait l'opérateur ternaire.

customerName == "Fred" ? "Hello Fred" : "Who are you?"
Andy Gaskell
la source
13
Pour développer la réponse d'Andy, vous verrez également des choses comme: customerName == user.logged_in? ? user.name: "Qui êtes-vous?" Notez le double point d'interrogation
Question Mark
16

Dans votre exemple

product.valid?

Est en fait un appel de fonction et appelle une fonction nommée valid?. Certains types de "test de condition" / fonctions booléennes ont un point d'interrogation dans le cadre du nom de la fonction par convention.

Timo Geusch
la source
41
answer.gsub! (/ function /, 'method')
glenn jackman
15

Il peut être utile de souligner que les ?s ne sont autorisés que dans les noms de méthode, pas dans les variables. Dans le processus d'apprentissage de Ruby, j'ai supposé que ?désigné un type de retour booléen, j'ai donc essayé de les ajouter aux variables d'indicateur, ce qui entraînait des erreurs. Cela m'a fait croire à tort pendant un certain temps qu'il existait une syntaxe spéciale concernant l' ?art.

Pertinent: pourquoi un nom de variable ne peut-il pas se terminer par «?» Alors qu'un nom de méthode peut le faire?

Rich Smith
la source
9

Je crois que c'est juste une convention pour les choses booléennes. Un peu comme dire " IsValid".

Neil Barnwell
la source
1
commentaire concis et impressionnant spécialement "Un peu comme dire" IsValid "
Kick Buttowski
2

Il est également utilisé dans les expressions régulières, ce qui signifie "au plus une répétition du caractère précédent"

par exemple, l'expression régulière /hey?/ correspond aux chaînes " he" et " hey".

José Joel.
la source
0

C'est aussi une convention courante à utiliser avec le premier argument de la méthode de test de Kernel # test

irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true

comme on le voit dans cette question ici

jtzero
la source
3
Ce n'est pas lié à test, ?dc'est un raccourci pour "d". testprend une chaîne d'un caractère comme premier argument, vous pouvez donc l'appeler avec test ?d, "/dev"ou test "d", "/dev".
bfontaine