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?
C'est "juste du sucre" pour la lisibilité, mais ils ont des significations communes:
!
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.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.?
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?".
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?
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.
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
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!