Los objetos inmutables son aquellos que no pueden cambiar de estado después de ser creados. Las propiedades por las que destacan son:
En Ruby, la mutabilidad es una propiedad de los objetos, no de una clase entera. Cualquier objeto (o instancia) se puede volver inmutable usando freeze
.
El método freeze
(congelar) evita que un objeto pueda modificarse, convirtiéndolo en una constante. Después de "congelar" el objeto, cualquier intento de modificarlo da como resultado un TypeError
.
str = 'Un simple string'
str.freeze # congelamos el string
# se intenta modificar (begin)
# y en caso de error (rescue)
# se lanza un mensaje. Ver Excepciones.
begin
str << 'Intento de modificarlo'
rescue => err
puts "#{err.class} #{err}"
end
Sin embargo, freeze funciona con las referencias, no con las variables: esto significa que si creamos un objeto nuevo, y sobreescribimos la variable, este se podrá modificar:
str = 'string original - '
str.freeze
str += 'añadido a posteriori'
puts str
El objeto original no cambió. Sin embargo, la variable str
se refiere a un nuevo objeto. El método frozen?
nos dice si un objeto está congelado o no.