Parfois, je vois des méthodes dans Ruby qui ont "?" et "!" à la fin, par exemple:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Je me demandais quel est leur but? S'agit-il simplement d'un revêtement en sucre de syntaxe?
Parfois, je vois des méthodes dans Ruby qui ont "?" et "!" à la fin, par exemple:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Je me demandais quel est leur but? S'agit-il simplement d'un revêtement en sucre de syntaxe?
Réponses:
C'est "juste un revêtement en sucre" pour plus de lisibilité, mais ils ont des significations communes:
!
effectuent des changements permanents ou potentiellement dangereux ; par exemple:
Enumerable#sort
renvoie une version triée de l'objet tout en le Enumerable#sort!
triant sur place.ActiveRecord::Base#save
renvoie false si l'enregistrement a échoué, tandis que ActiveRecord::Base#save!
déclenche une exception.Kernel::exit
provoque la fermeture d'un script, tout en le Kernel::exit!
faisant immédiatement, en contournant les gestionnaires de sortie.?
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.zero
semble 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 name
variable contient réellement le nom inversé. name.is_binary_data?
ressemble à "est-ce que des name
données binaires?".
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 .
Le point d'interrogation indique que la méthode renvoie un booléen. Déjà répondu ici:
Que signifie l'opérateur point d'interrogation dans 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?
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.
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
?
sont également appelées méthodes de prédicat.
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!