Question Pourquoi les points d'exclamation sont-ils utilisés dans les méthodes Ruby?


Dans Ruby, certaines méthodes ont un point d’interrogation (?) qui posent une question comme include? qui demandent si l'objet en question est inclus, cela retourne alors un vrai / faux.

Mais pourquoi certaines méthodes ont-elles des points d'exclamation (!) où les autres ne le font pas?

Qu'est-ce que ça veut dire?


444
2018-03-04 20:02


origine


Réponses:


En général, les méthodes qui se terminent par ! indiquer que la méthode modifier l'objet sur lequel il est appelé. Ruby les appelle comme "méthodes dangereuses"parce qu’ils changent l’état auquel une autre personne peut avoir une référence. Voici un exemple simple de chaînes:

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

Cela va produire:

a string

Dans les bibliothèques standard, il y a beaucoup d'endroits où vous verrez des paires de méthodes portant un nom similaire, une avec les ! et un sans. Ceux qui ne sont pas appelés "méthodes sûres", et ils retournent une copie de l'original avec des changements appliqués à la copie, avec l'appelé inchangé. 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

Cela produit:

A STRING
a string

Gardez à l'esprit que c'est juste une convention, mais beaucoup de classes Ruby le suivent. Il vous aide également à garder une trace de ce qui est modifié dans votre code.


523
2018-03-04 20:04



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

Comme d'autres l'ont 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 récepteur et n'ont pas de point d'exclamation (pop, shift, clear), et certaines méthodes avec des points d’exclamation ne modifient pas leur 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 va lancer une exception en cas d'échec plutôt que d'échouer silencieusement.

C'est une convention de nommage mais beaucoup de gens l'utilisent de manière subtile. Dans votre propre code, une bonne règle est de l'utiliser quand une méthode fait quelque chose de "dangereux", surtout quand il existe deux méthodes avec le même nom et l'une d'entre elles est plus "dangereuse" que l'autre. "Dangereux" peut signifier presque n'importe quoi cependant.


124
2018-03-04 21:59



Cette convention de dénomination est levée de Schème.

1.3.5 Conventions de dénomination

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

Par convention, les noms des procédures   ces valeurs de magasin dans précédemment   emplacements attribués (voir section 3.4)   se termine généralement par ``! ''. Ces procédures   sont appelées procédures de mutation. Par   convention, la valeur renvoyée par un   procédure de mutation n'est pas spécifiée.


60
2018-03-04 21:44



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

Les méthodes qui sont "dangereuses" ou qui modifient le récepteur peuvent être nommées avec un "!"


23
2018-03-04 20:04



De themomorohoax.com:

Un coup peut être utilisé de la manière ci-dessous, dans l'ordre de mes préférences personnelles.

1) Une méthode d'enregistrement active déclenche une erreur si la méthode ne le fait pas   ce qu'il dit qu'il va.

2) Une méthode d'enregistrement active enregistre l'enregistrement ou une méthode enregistre un   objet (p.ex. bande!)

3) Une méthode fait quelque chose "extra", comme des messages à un endroit, ou fait   une action.

Le point est: n'utilisez un coup que lorsque vous avez vraiment réfléchi à savoir si il est nécessaire, pour sauver d'autres développeurs, l'ennui de devoir Vérifiez pourquoi vous utilisez un coup.

Le bang fournit deux indices aux autres développeurs.

1) qu'il n'est pas nécessaire de sauvegarder l'objet après avoir appelé   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/when-to-use-a-bang-exclamation-point-after-rails-methods


14
2017-09-09 00:05



Il est plus juste de dire que les méthodes avec un Bang! sont les plus dangereux ou surprenant version. Il y a beaucoup de méthodes qui se transforment sans Bang telles que .destroy et dans les méthodes générales ont seulement des bangs où une alternative plus sûre existe dans le noyau lib.

Par exemple, sur Array, nous avons .compact et .compact!, les deux méthodes mutent le tableau, mais .compact! retourne zéro au lieu de soi s'il n'y a pas de nul dans le tableau, ce qui est plus surprenant que de se retourner soi-même.

La seule méthode non-mutation que j'ai trouvée avec un bang est Kernelde .exit! ce qui est plus surprenant que .exit parce que vous ne pouvez pas attraper SystemExit tandis que le processus se ferme.

Rails et ActiveRecord poursuivent cette tendance en utilisant bang pour des effets plus "surprenants" comme .create! ce qui soulève des erreurs en cas d'échec.


13
2018-02-15 22:38



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 changerait définitivement en downcase. downcase! ne retournerait pas un nouvel objet chaîne mais remplacerait la chaîne en place, changeant totalement le foo descendre. Je vous suggère de ne pas utiliser downcase! sauf si c'est totalement nécessaire.


6
2017-09-14 11:51