web-dev-qa-db-fra.com

Quel est le but de "!" et "?" à la fin des noms de méthodes?

Parfois, je vois des méthodes dans Ruby qui ont "?" et "!" à la fin d'eux, par exemple:

name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?

Je me demandais quel est leur but? S'agit-il juste de la syntaxe sugarcoating?

88
itsaboutcode

C'est "juste du sucre" pour la lisibilité, mais ils ont des significations communes:

  • Les méthodes se terminant par ! effectuent des modifications permanentes ou potentiellement dangereuses ; par exemple:
    • Enumerable#sort renvoie une version triée de l'objet pendant que Enumerable#sort! le trie à la place.
    • Dans Rails, ActiveRecord::Base#save renvoie false si l'enregistrement a échoué, alors que ActiveRecord::Base#save! déclenche une exception.
    • Kernel::exit provoque la fermeture d'un script, alors que Kernel::exit! le fait immédiatement, en ignorant les gestionnaires de sortie.
  • Les méthodes se terminant par ? renvoient un booléen , ce qui rend le flux de code encore plus intuitif, comme une phrase - if number.zero? se lit comme "si le nombre est égal à zéro", mais if number.zero a un aspect bizarre.

Dans votre exemple, name.reverse correspond à une chaîne inversée, mais ce n'est qu'après la ligne name.reverse! que la variable name a réellement contient le nom inversé. name.is_binary_data? ressemble à "is name binary data?".

146
jtbandes

Le point d'interrogation indique que la méthode retourne un booléen. Déjà répondu ici:

Qu'est-ce que l'opérateur de point d'interrogation signifie en Ruby?

Le bang indique que la méthode agit sur l'objet lui-même. Déjà répondu ici:

Pourquoi les points d'exclamation sont-ils utilisés dans les méthodes Ruby?

13
Bill

En Ruby, le ? signifie que la méthode va renvoyer un booléen et le ! modifie l'objet sur lequel il a été appelé. Ils sont là pour améliorer la lisibilité lorsque vous regardez le code.

7
J Lundberg

Contrairement à - je suppose - la majorité des langages de programmation ...

Ruby, les méthodes sont autorisées à se terminer par des points d'interrogation ou d'exclamation. 

Par convention, les méthodes qui répondent aux questions (c'est-à-dire Array # empty? Renvoie true si le récepteur est vide) se terminent par des points d'interrogation. 

Les méthodes potentiellement «dangereuses» (par exemple, les méthodes qui modifient soi-même ou les arguments, exit! Etc.) par convention se terminent par des points d'exclamation.

De: http://www.Ruby-lang.org/en/documentation/Ruby-from-other-languages/ , Section Noms de méthode drôles

5
miku

Attention, ce n'est pas toujours le cas. Prenons, par exemple, Ruby Array # concat http://docs.Ruby-lang.org/fr/2.0.0/Array.html#method-i-concat

Où vous pouvez être gravement brûlé ressemble à MyActiveRecordModel.column_names.concat([url]). Les appels ultérieurs liés à MyActiveRecordModel tenteront de rechercher une colonne de 'url' pour MyActiveRecordModel et de lancer. 

Au lieu de cela, vous devez le cloner avant de faire le concat. Heureusement, ma suite de tests a attrapé celui-ci, mais .. tête haute!

0
wintondeshong