647 votes

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

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

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

Qu'est-ce que cela signifie ?

26 votes

Synonyme : bang, point d'exclamation

17 votes

La réponse acceptée devrait être modifiée comme suit stackoverflow.com/a/612653/109618 . Voir wobblini.net/bang.txt y ruby-forum.com/topic/176830#773946 -- "Le signe bang signifie "la version bang est plus dangereuse que sa contrepartie non bang ; manipulez-la avec précaution"" -Matz

3 votes

La méthode bang serait un excellent choix de conception si uniquement y todo Les méthodes de bang étaient dangereuses. Malheureusement, elles ne le sont pas, et cela devient donc un exercice frustrant de mémorisation de ce qui est et n'est pas mutable.

728voto

tgamblin Points 25755

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

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

Cela produira un résultat :

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, l'une d'entre elles avec l'attribut ! et une autre sans. Celles qui ne le sont pas sont appelées "méthodes sûres", et elles renvoient une copie de l'original avec les modifications appliquées à la copie avec le destinataire 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

Ces sorties :

A STRING
a string

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

2 votes

Il y a aussi des cas comme exit contre exit ! et (dans les rails) save contre save !

33 votes

Soyez très prudent - de nombreuses petites bibliothèques ne respectent pas cette convention. Si des choses étranges se produisent, remplacer obj.whatever ! par obj=obj.whatever ! résout souvent le problème. Très frustrant.

121 votes

Bang est également utilisé pour les méthodes qui lèvent une exception alors que la méthode sans ne le fait pas, par exemple : save y save! en ActiveRecord

174voto

Brian Carper Points 40078

Le point d'exclamation signifie beaucoup de choses, et parfois, il ne permet pas de savoir grand-chose d'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 amène un objet à se muter, mais pas toujours. Notez que de nombreuses méthodes standard changent leur récepteur et n'ont pas de point d'exclamation ( pop , shift , clear ), et certaines méthodes avec des points d'exclamation ne changent 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 lèvera une exception en cas d'échec plutôt que d'échouer en silence.

Il s'agit d'une convention de dénomination, mais de nombreuses personnes l'utilisent de manière subtilement différente. Dans votre propre code, une bonne règle à suivre est de l'utiliser lorsqu'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. Mais "dangereux" peut signifier presque n'importe quoi.

89voto

Steven Huwig Points 8029

Cette convention de dénomination est tirée 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 " ?". De telles procédures sont appelées prédicats.

Par convention, les noms des procédures qui stockent des valeurs dans des emplacements dans des emplacements préalablement alloués (voir section 3.4) se terminent généralement par " !". De telles procédures sont appelées procédures de mutation. Par convention convention, la valeur renvoyée par une procédure de mutation n'est pas spécifiée.

3 votes

+1 à cette réponse car il y a une documentation qui donne des explications raisonnables pour l'utilisation ! Très bonne réponse Steven

0 votes

Merci @DavidSilveira !

28voto

Pesto Points 16648

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

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

20voto

Edward Castaño Points 302

De themomorohoax.com :

Un bang peut être utilisé des manières suivantes, dans l'ordre de mes préférences personnelles.

1) Une méthode d'enregistrement active soulève une erreur si la méthode ne fait pas ce qu'elle dit qu'elle fera.

2) Une méthode d'enregistrement actif sauvegarde l'enregistrement ou une méthode sauvegarde un objet (par exemple, strip !)

3) Une méthode fait quelque chose de "supplémentaire", comme envoyer un message à un endroit donné, ou faire une action quelconque.

L'idée est la suivante : n'utilisez un bang que si vous avez vraiment réfléchi à sa nécessité. nécessaire, afin d'éviter aux autres développeurs d'avoir à vérifier pourquoi vous utilisez un bang. de vérifier pourquoi vous utilisez un bang.

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é la 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X