Question

En Ruby, certaines méthodes ont un point d’interrogation (? ) qui pose une question comme include? qui demande si l’objet en question est inclus, cela retourne alors un vrai / false.

Mais pourquoi certaines méthodes ont-elles des points d'exclamation (! ) alors que d'autres n'en ont pas?

Qu'est-ce que cela signifie?

Était-ce utile?

La solution

En général, les méthodes qui se terminent par ! indiquent que la méthode va modifier l'objet sur lequel elle est appelée . Ruby appelle ces "méthodes dangereuses" ". parce qu'ils changent d'état que quelqu'un d'autre pourrait avoir une référence. Voici un exemple simple pour les chaînes:

foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

Ceci produira:

a string

Dans les bibliothèques standard, il existe de nombreux endroits où vous verrez des paires de méthodes portant le même nom, l'une avec le ! et l'autre sans. Ceux qui ne le sont pas sont appelés "méthodes sûres" et renvoient une copie de l'original avec les modifications appliquées à la copie , sans modification de l'appelé. Voici le même exemple sans le ! :

foo = "A STRING"    # a string called foo
bar = foo.downcase  # doesn't modify foo; returns a modified string
puts foo            # prints unchanged foo
puts bar            # prints newly created bar

Cette sortie:

A STRING
a string

N'oubliez pas qu'il ne s'agit que d'une convention, mais de nombreuses classes Ruby la suivent. Cela vous aide également à garder une trace de ce qui est modifié dans votre code.

Autres conseils

Le point d'exclamation signifie beaucoup de choses, et parfois vous ne pouvez pas en dire plus que "c'est dangereux, soyez prudent".

Comme d'autres l'ont déjà dit, dans les méthodes standard, il est souvent utilisé pour indiquer une méthode qui provoque la mutation d'un objet, mais pas toujours. Notez que de nombreuses méthodes standard changent de destinataire et qu’elles n’ont pas de point d’exclamation ( pop , shift , clear ) et certaines méthodes avec exclamation. les points ne changent pas de récepteur ( exit! ). Voir cet article , par exemple.

D'autres bibliothèques peuvent l'utiliser différemment. Dans Rails, un point d’exclamation signifie souvent que la méthode lève une exception en cas d’échec plutôt que d’échouer en silence.

C’est une convention de nommage, mais de nombreuses personnes l’utilisent de manière légèrement différente. Dans votre propre code, une bonne règle empirique consiste à l’utiliser chaque fois qu’une méthode fait quelque chose de "dangereux", en particulier lorsque deux méthodes portant le même nom existent et que l’une d’entre elles est plus "dangereuse". que l'autre. " Dangereux " peut signifier presque n'importe quoi cependant.

Cette convention de dénomination découle de Schéma .

  

1.3.5 Conventions de dénomination

     

Par convention, les noms des procédures   qui retournent toujours une valeur booléenne   se terminent généralement par «? Ces procédures   sont appelés prédicats.

     

Par convention, les noms des procédures   que les valeurs de magasin dans précédemment   emplacements attribués (voir section 3.4)   se terminent généralement par "!". Ces procédures   sont appelés procédures de mutation. Par   convention, la valeur renvoyée par un   La procédure de mutation est indéterminée.

! signifie généralement que la méthode agit sur l'objet au lieu de renvoyer un résultat. Extrait du livre Programmer Ruby :

  

Méthodes "dangereuses", ou modifier le destinataire, peut être nommé avec le signe "!!".

.

De themomorohoax.com:

Une détonation peut être utilisée de la manière ci-dessous, par ordre de préférence.

  

1) Une méthode d'enregistrement active génère une erreur si la méthode ne fonctionne pas.   ce qu'il dit, il le fera.

     

2) Une méthode d’enregistrement actif enregistre l’enregistrement ou une méthode enregistre une   objet (par exemple, strip!)

     

3) Une méthode fait quelque chose d’extra, comme envoyer des messages à   un peu d'action.

Le problème est le suivant: utilisez uniquement un bang lorsque vous avez vraiment réfléchi à la question de savoir si nécessaire, pour éviter aux autres développeurs le désagrément de devoir vérifiez pourquoi vous utilisez un coup.

La détonation fournit deux indices aux autres développeurs.

  

1) qu'il n'est pas nécessaire de sauvegarder l'objet après avoir appelé le   méthode.

     

2) lorsque vous appelez la méthode, la base de données va être modifiée.

http: // www .themomorohoax.com / 2009/02/11 / méthodes-à-utiliser-un-bang-exclamation-point-après-rails-méthodes

Il est tout à fait exact de dire que les méthodes avec un Bang! sont les dangereux ou version surprenante . Il existe de nombreuses méthodes qui muent sans coup, telles que < code> .destroy et, dans les méthodes générales, n’ont de frange qu’une alternative plus sûre existe dans la bibliothèque principale.

Par exemple, sur Array, nous avons .compact et .compact! , les deux méthodes mutent le tableau, mais .compact! renvoie nil. au lieu de vous-même s'il n'y a pas de zéro dans le tableau, ce qui est plus surprenant que de simplement revenir à vous-même.

La seule méthode non mutante que j'ai trouvée avec un bang est le code du noyau .exit! qui est plus surprenant que .exit car vous ne pouvez pas saisir < code> SystemExit pendant la fermeture du processus.

Rails et ActiveRecord poursuivent cette tendance en utilisant des effets exceptionnels tels que .create! qui génère des erreurs en cas d'échec.

Explication simple:

foo = "BEST DAY EVER" #assign a string to variable foo.

=> foo.downcase #call method downcase, this is without any exclamation.

"best day ever"  #returns the result in downcase, but no change in value of foo.

=> foo #call the variable foo now.

"BEST DAY EVER" #variable is unchanged.

=> foo.downcase! #call destructive version.

=> foo #call the variable foo now.

"best day ever" #variable has been mutated in place.

Mais si vous avez déjà appelé une méthode downcase! dans l'explication ci-dessus, foo deviendrait en permanence downcase. downcase! ne renverrait pas un nouvel objet chaîne, mais remplacerait la chaîne à la place, remplaçant totalement foo par downcase. Je suggère que vous n'utilisiez pas downcase! sauf si cela est absolument nécessaire.

!

J'aime penser à cela comme à un changement explosif qui détruit tout ce qui l’a précédé. Déclenchement ou point d'exclamation signifie que vous apportez une modification enregistrée permanente à votre code.

Si vous utilisez par exemple la méthode de Ruby pour la substitution globale gsub! , la substitution que vous effectuez est permanente.

Vous pouvez également l’imaginer en ouvrant un fichier texte et en recherchant et en remplaçant, puis en enregistrant. ! fait la même chose dans votre code.

Un autre rappel utile, si vous venez du monde bash, est que sed -i a le même effet de créer des modifications enregistrées de manière permanente.

Appelé "Méthodes destructrices". Ils ont tendance à changer la copie originale de l'objet auquel vous faites référence.

numbers=[1,0,10,5,8]
numbers.collect{|n| puts n*2} # would multiply each number by two
numbers #returns the same original copy
numbers.collect!{|n| puts n*2} # would multiply each number by two and destructs the original copy from the array
numbers   # returns [nil,nil,nil,nil,nil]

Ligne inférieure: les méthodes ! changent simplement la valeur de l'objet sur lequel elles sont appelées, alors qu'une méthode sans ! renvoie une valeur manipulée sans écrire sur l'objet de la méthode a été appelé.

Utilisez uniquement ! si vous prévoyez de ne pas avoir besoin de la valeur d'origine stockée dans la variable sur laquelle vous avez appelé la méthode.

Je préfère faire quelque chose comme:

foo = "word"
bar = foo.capitalize
puts bar

OU

foo = "word"
puts foo.capitalize

Au lieu de

foo = "word"
foo.capitalize!
puts foo

Juste au cas où j'aimerais accéder à nouveau à la valeur d'origine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top