¿Por qué se utilizan signos de exclamación en los métodos Ruby?
En Ruby, algunos métodos tienen un signo de interrogación ( ?
) que formula una pregunta comoinclude?
esa: si el objeto en cuestión está incluido, esto luego devuelve verdadero/falso.
Pero, ¿por qué algunos métodos tienen signos de exclamación (!
) mientras que otros no?
¿Qué significa?
En general, los métodos que terminan en !
indican que el método modificará el objeto al que se llama . Ruby los llama " métodos peligrosos " porque cambian de estado al que otra persona podría tener una referencia. Aquí hay un ejemplo simple para cadenas:
foo = "A STRING" # a string called foo
foo.downcase! # modifies foo itself
puts foo # prints modified foo
Esto generará:
a string
En las bibliotecas estándar, hay muchos lugares donde verá pares de métodos con nombres similares, uno con !
y otro sin. Los que no los tienen se denominan "métodos seguros" y devuelven una copia del original con los cambios aplicados a la copia , con el destinatario sin cambios. Aquí está el mismo ejemplo sin !
:
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
Esto produce:
A STRING
a string
Tenga en cuenta que esto es sólo una convención, pero muchas clases de Ruby la siguen. También le ayuda a realizar un seguimiento de lo que se modifica en su código.
El signo de exclamación significa muchas cosas y, a veces, no se puede distinguir mucho más que "esto es peligroso, ten cuidado".
Como han dicho otros, en los métodos estándar se usa a menudo para indicar un método que hace que un objeto mute, pero no siempre. Tenga en cuenta que muchos métodos estándar cambian su receptor y no tienen un signo de exclamación ( pop
, shift
, clear
), y algunos métodos con signos de exclamación no cambian su receptor ( exit!
). Vea este artículo, por ejemplo.
Otras bibliotecas pueden usarlo de manera diferente. En Rails, un signo de exclamación a menudo significa que el método generará una excepción en caso de falla en lugar de fallar silenciosamente.
Es una convención de nomenclatura, pero mucha gente la utiliza de formas sutilmente diferentes. En su propio código, una buena regla general es usarlo siempre que un método esté haciendo algo "peligroso", especialmente cuando existen dos métodos con el mismo nombre y uno de ellos es más "peligroso" que el otro. Sin embargo, "peligroso" puede significar casi cualquier cosa.