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#sortrenvoie une version triée de l'objet tout en le Enumerable#sort!triant sur place.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.?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?".
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!