Bueno, las constantes en Ruby son relativamente variables. Los objetos a los que apuntan se pueden intercambiar (como en su ejemplo) y también se puede cambiar su estado.
class TestClass
Constant = []
end
TestClass::Constant << "no warning at all!"
La única ventaja que proporcionan son las advertencias que se generan cuando se hace un punto constante existente a otro objeto. Ver "Programming Ruby", section "Variables and Constants". Es viejo pero aún válido.
El propósito de las constantes de Ruby es indicar que una referencia determinada no debe modificarse. Por ejemplo, si lo hace Math::PI = 3.0
, merece ser advertido.
Teóricamente, podría romper la compatibilidad con la implementación original e imponer la inmutabilidad de las constantes. Como resultado, podría obtener una ligera mejora en el rendimiento gracias al envío optimizado de métodos.
En el ejemplo anterior, usted sabría que Constant.is_a? Array
por lo que el envío del símbolo <<
al método real podría realizarse solo una vez, en la primera ejecución de esa línea. El problema es que Ruby te permite redefinir Array#<<
, lo que hace que el problema sea más complicado.
Comprobando si varias implementaciones de Ruby intentan utilizar dicha optimización requerirá una investigación adicional y una excavación en su documentación o fuentes.
Al igual que con otras cosas, Ruby tiene que confiar en las mentes sanas de los desarrolladores por un montón de cosas que el compilador/intérprete impone en otros idiomas debido a su dinamismo. Es una convención que no cambia las constantes y puede estar seguro de que no se cambiarán durante el tiempo de ejecución. – Reactormonk
posible duplicado de [¿Lanzar excepción al volver a asignar una constante en Ruby?] (Http://stackoverflow.com/questions/3023617/throw-exception-when-re-assigning-a-constant-in-ruby) –