2012-01-17 16 views
5
class TestClass 
    CONSTANT = 1 
end 

TestClass::CONSTANT = 2 

Aparentemente puede cambiar el valor de la constante en Ruby en cualquier momento. ¿Por qué se los llama "constantes" si puedes cambiarlos?¿Por qué puedo cambiar las constantes?

¿Cuál es el propósito de estas 'constantes'? ¿De qué manera la capacidad de cambiar su valor facilita la programación?

+1

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

+0

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) –

Respuesta

6

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.

Cuestiones relacionadas