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

Réponses:

160

C'est "juste un revêtement en sucre" pour plus de lisibilité, mais ils ont des significations communes:

  • Les méthodes se terminant par !effectuent des changements permanents ou potentiellement dangereux ; par exemple:
    • Enumerable#sortrenvoie une version triée de l'objet tout en le Enumerable#sort!triant sur place.
    • Dans Rails, ActiveRecord::Base#saverenvoie false si l'enregistrement a échoué, tandis que ActiveRecord::Base#save!déclenche une exception.
    • Kernel::exitprovoque la fermeture d'un script, tout en le Kernel::exit!faisant immédiatement, en contournant les gestionnaires de sortie.
  • Les méthodes se terminant par ?un booléen , ce qui rend le code encore plus intuitif comme une phrase - se if number.zero?lit comme "si le nombre est zéro", mais if number.zerosemble juste bizarre.

Dans votre exemple, correspond name.reverseà une chaîne inversée, mais ce n'est qu'après la name.reverse!ligne que la namevariable contient réellement le nom inversé. name.is_binary_data?ressemble à "est-ce que des namedonnées binaires?".

jtbandes
la source
22
Une note importante est que vous ne devriez avoir une méthode bang que si vous avez également une méthode non-bang correspondante. Le bang sert à distinguer la version "plus surprenante" de la méthode de la version "moins surprenante". Si vous n'avez qu'une seule méthode, vous n'avez pas besoin de faire de distinction et vous ne devriez pas la nommer avec un bang. Voir Array#clear, par exemple. Il efface le tableau. Effacer le tableau le fait muter naturellement. Il n'y a rien d'étonnant à cela, le nom l'indique déjà clairement: pas de bang. Voir ruby-forum.com/topic/176830#773946 .
Jörg W Mittag
2
Ajoutant à ce que @ JörgWMittag a déclaré, selon le Ruby Style Guide : Les noms des méthodes potentiellement dangereuses (c'est-à-dire les méthodes qui modifient self ou les arguments, exit! (Ne lance pas les finaliseurs comme le fait exit), etc.) devraient se terminer par un point d'exclamation s'il existe une version sûre de cette méthode dangereuse .
Tod Birdsall
2
Attention, ce n'est pas toujours le cas. Par exemple, Ruby Array # concat docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat . Là où vous pouvez être gravement brûlé, c'est quelque chose comme MyActiveRecordModel.column_names.concat (...). Au lieu de cela, vous devez le cloner avant de faire le concat.
wintondeshong
8

Dans Ruby ?, cela signifie que la méthode va retourner un booléen et !modifie l'objet sur lequel elle a été appelée. Ils sont là pour améliorer la lisibilité lors de l'examen du code.

J Lundberg
la source
5

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

Ruby, les méthodes peuvent se terminer par des points d'interrogation ou des points d'exclamation.

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

Les méthodes potentiellement «dangereuses» (c'est-à-dire les méthodes qui modifient soi-même ou les arguments, sortent! 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éthodes amusants

Miku
la source
1
Les méthodes se terminant par ?sont également appelées méthodes de prédicat.
Waseem
1

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

Où vous pouvez vous brûler gravement est quelque chose comme MyActiveRecordModel.column_names.concat([url]). Les appels ultérieurs liés à MyActiveRecordModel essaieront de rechercher une colonne «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 ... attention!

wintondeshong
la source