270 votes

Que signifie le point d'interrogation à la fin du nom d'une méthode en Ruby ?

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

Parfois, ça ressemble à ça :

assert !product.valid?

parfois, c'est dans un if construire.

3 votes

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 accompagné de deux points est un opérateur conditionnel ternaire. Le point d'interrogation seul est un opérateur de citation unaire. Voir stackoverflow.com/questions/16641205/

371voto

chillitom Points 5731

Il s'agit d'une convention de style de code ; elle indique qu'une méthode renvoie une valeur booléenne (vrai ou faux) ou un objet pour indiquer une valeur vraie (ou valeur "véridique").

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

https://docs.ruby-lang.org/en/2.0.0/syntax/methods_rdoc.html#label-Method+Noms

14 votes

Merci, mais est-ce que cette convention signifie qu'il fait le logique uniquement ou pourrait-il y avoir des effets secondaires ? Il est amusant de constater que c'est une sorte de piratage autour des langages typés avec le type de retour dans le code.

9 votes

Dans ce cas, il s'agit strictement d'une convention de dénomination des méthodes. Il n'y a pas d'application d'une valeur de retour booléenne. Le fait que le nom de la méthode se termine par un point d'interrogation ne signifie pas que la méthode doit retourner un booléen ...mais il est certain qu'elle devrait retourner un booléen. Cependant, il existe plusieurs autres utilisations de la fonction ? en Ruby (est un opérateur ternaire, convertissant un caractère en son entier ASCII, utilisation en test ), dont beaucoup sont couverts dans les autres réponses ici.

6 votes

@Jason Pour votre information, même les langages fortement typés ont des conventions comme celle-ci. Par exemple, en Java, les méthodes qui renvoient une valeur booléenne sont souvent préfixées par "is", comme dans isEmpty() , isDigit() etc. En Ruby, les mêmes méthodes seraient écrites empty? y digit? qui est un peu plus agréable, selon moi.

88voto

Greg Osuri Points 381

Notez également ? accompagné d'un caractère sert de raccourci pour un littéral de chaîne à un seul caractère depuis Ruby 1.9.

Par exemple :

?F # => is the same as "F"

Il est référencé près du bas de la page section sur les chaînes de caractères de la documentation ruby :

Il existe également une notation littérale des caractères pour représenter des caractères uniques. de caractères uniques, dont la syntaxe est un point d'interrogation ( ?) suivi d'un caractère unique ou d'une séquence d'échappement qui correspond à un seul point de code dans le codage script :

?a       #=> "a"
?abc     #=> SyntaxError
?\n      #=> "\n"
?\s      #=> " "
?\\      #=> "\\"
?\u{41}  #=> "A"
?\C-a    #=> "\x01"
?\M-a    #=> "\xE1"
?\M-\C-a #=> "\x81"
?\C-\M-a #=> "\x81", same as above
?あ      #=> "あ"

Avant Ruby 1.9, cela retournait le code ASCII du caractère. Pour obtenir l'ancien comportement dans le Ruby moderne, vous pouvez utiliser la fonction #ord méthode :

?F.ord # => will return 70

33 votes

En ruby 1.9, il retournera 'F'

54voto

Eifion Points 2471

En Ruby, il est de coutume que les méthodes qui renvoient des valeurs booléennes se terminent par un point d'interrogation. Il n'y a pas d'autre signification que celle-là.

30voto

Andy Gaskell Points 15264

Dans votre exemple, c'est juste une partie du nom de la méthode. En Ruby, vous pouvez également utiliser des points d'exclamation dans les noms de méthodes !

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

customerName == "Fred" ? "Hello Fred" : "Who are you?"

14 votes

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

20voto

Timo Geusch Points 16952

Dans votre exemple

product.valid?

est en fait un appel de fonction et appelle une fonction nommée valid? . Par convention, certains types de fonctions booléennes/de "test de condition" comportent un point d'interrogation dans le nom de la fonction.

43 votes

Réponse.gsub !(/function/, 'method')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X