Las variables de instancia comienzan con un signo at (@) y solo pueden referenciarse dentro de los métodos de clase. Se diferencian de las variables locales en que no existen dentro de ningún particular alcance. En cambio, se almacena una tabla variable similar para cada instancia de una clase. Las variables de instancia viven dentro de una instancia de clase, por lo tanto, mientras esa instancia permanezca viva, también lo harán las variables de instancia.
Las variables de instancia se pueden referenciar en cualquier método de esa clase. Todos los métodos de una clase usan la misma instancia tabla variable, a diferencia de las variables locales donde cada método tendrá una tabla de variables diferente. Sin embargo, es posible acceder a variables de instancia sin definirlas primero. Esto no generará una excepción, pero el valor de la variable será nulo y se emitirá una advertencia si ha ejecutado Ruby con el -w cambiar.
Este ejemplo demuestra el uso de variables de instancia. Tenga en cuenta que el
el asunto contiene la -w interruptor, que imprimirá advertencias en caso de que ocurran. Además, tenga en cuenta el uso incorrecto fuera de un método en el ámbito de la clase. Esto es incorrecto y se analiza a continuación.Porque es el @prueba variable incorrecta? Esto tiene que ver con el alcance y cómo Ruby implementa las cosas. Dentro de un método, el alcance de la variable de instancia se refiere a la instancia particular de esa clase. Sin embargo, en el alcance de la clase (dentro de la clase, pero fuera de cualquier método), el alcance es el instancia de clase alcance. Ruby implementa la jerarquía de clases instanciando Clase objetos, entonces hay un segunda instancia en juego aquí. El primero ejemplo es una instancia de la Clase clase, y aquí es donde @prueba iré. La segunda instancia es la instanciación de TestClassy aquí es donde @valor iré. Esto se vuelve un poco confuso, pero recuerda no usar nunca @variables de instancia fuera de los métodos. Si necesita almacenamiento para toda la clase, use @@ class_variables, que se puede usar en cualquier lugar del alcance de la clase (dentro o fuera de los métodos) y se comportará igual.
Normalmente no puede acceder a las variables de instancia desde fuera de un objeto. Por ejemplo, en el ejemplo anterior, no puede simplemente llamar t.valor o t. @ valor para acceder a la variable de instancia @valor. Esto rompería las reglas de encapsulamiento. Esto también se aplica a las instancias de clases secundarias, no pueden acceder a las variables de instancia que pertenecen a la clase principal, aunque técnicamente son del mismo tipo. Entonces, para proporcionar acceso a las variables de instancia, accesor Los métodos deben ser declarados.
El siguiente ejemplo demuestra cómo se pueden escribir los métodos de acceso. Sin embargo, tenga en cuenta que Rubí proporciona un acceso directo y que este ejemplo solo existe para mostrarle cómo funcionan los métodos de acceso. Por lo general, no es común ver métodos de acceso escritos de esta manera a menos que se necesite algún tipo de lógica adicional para el acceso.
Los atajos hacen las cosas un poco más fáciles y más compactas. Hay tres de estos métodos de ayuda. Deben ejecutarse en el ámbito de la clase (dentro de la clase pero fuera de cualquier método), y definirán dinámicamente los métodos de manera muy similar a los métodos definidos en el ejemplo anterior. Aquí no hay magia, y parecen palabras clave de lenguaje, pero en realidad solo son métodos que definen dinámicamente. Además, estos accesores suelen ir en la parte superior de la clase. Eso le da al lector una visión general instantánea de qué variables miembro estarán disponibles fuera de la clase o para las clases secundarias.
Hay tres de estos métodos de acceso. Cada uno toma una lista de símbolos que describen las variables de instancia a las que se debe acceder.
- attr_reader - Definir métodos de "lector", como el nombre método en el ejemplo anterior.
- attr_writer - Definir métodos de "escritor" como el edad = método en el ejemplo anterior.
- attr_accessor - Definir los métodos "lector" y "escritor".
Cuándo usar las variables de instancia
Ahora que sabe qué son las variables de instancia, ¿cuándo las usa? Las variables de instancia deben usarse cuando representan el estado del objeto. El nombre y la edad de un estudiante, sus calificaciones, etc. No deben usarse para almacenamiento temporal, para eso están las variables locales. Sin embargo, posiblemente podrían usarse para el almacenamiento temporal entre llamadas a métodos para cálculos de etapas múltiples. Sin embargo, si está haciendo esto, es posible que desee repensar la composición de su método y convertir estas variables en parámetros del método.