20.1. Variables globales
Una variable global tiene un nombre que comienza con $. Se puede utilizar en cualquier parte de un programa. Antes de inicializarse, una variable global tiene el valor especial nil.
ruby> $foo
nil
ruby> $foo = 5
5
ruby> $foo
5
La variables globales deben utilizarse con parquedad. Son peligrosas porque se pueden modificar desde cualquier lugar. Una sobreutilización de variables globales puede dificultar la localización de errores; también indica que no se ha pensado detenidamente el diseño del programa. Siempre que se encuentre la necesidad de utilizar una variable global, hay que darle un nombre descriptivo para que no se pueda utilizar inadvertidamente para otra cosa (Llamarle $foo como se ha hecho en el ejemplo es probablemente una mala idea) Una característica notable de las variables globales es que se pueden trazar; se puede definir un procedimiento que se llame cada vez que se modifique el valor de la variable.
ruby> trace_var:$x, proc{print «$x es ahora «, $x, «\n»}
nil
ruby> $x = 5
$x es ahora 5
5
Cuando una variable global se la atavía para que funcione con un disparador que se llama cada vez que se modifica, se la conoce como variable activa. Son útiles, por ejemplo, para mantener un GUI actualizado.
Existe un grupo especial de variables cuyos nombres constan del símbolo del dolar ($) seguido de un carácter. Por ejemplo, $$ contiene el número de identificación del proceso del intérprete de Ruby, y es de sólo lectura. A continuación se muestran las principales variables del sistema y su significado (acudir al manual de referencia de Ruby para más detalles)
$! | Último mensaje de error |
$@ | Posición del error |
$_ | Última cadena leída con gets |
$. | Último número de línea leído por el interprete |
$& | Última cadena que ha coincidido con una expresión
regular |
$~ | Última cadena que ha coincidido con una expresión
regular como array de subexpresiones |
$n | La n-ésima subexpresión regular de la última
coincidencia (igual que $~[n]) |
$= | flag para tratar igual las mayúsculas y minúsculas |
$/ | Separador de registros de entrada |
$\ | Separador de registros de salida |
$0 | El nombre del fichero del guión Ruby |
$* | El comando de la línea de argumentos |
$$ | El número de identificación del proceso del intérprete
Ruby |
$? | Estado de retorno del último proceso hijo ejecutado |
De las variables anteriores $_ y $~, tienen ámbito local. Sus nombres sugieren que deberían tener ámbito global, pero son más útiles de esta forma y existen razones históricas para utilizar estos identificadores.
20.2. Variables de instancia
Una variable de instancia tiene un nombre que comienza con @ y su ámbito está limitado al objeto al que referencia self. Dos objetos diferentes, aún cuando pertenezcan a la misma clase, pueden tener valores diferentes en sus variables de instancia. Desde el exterior del objeto, las variables de instancia, no se pueden alterar e incluso, no se pueden observar (es decir, en Ruby las variables de instancia nunca son públicas) a excepción de los métodos proporcionados explícitamente por el programador. Como con las variables globales, las variables de instancia tienen el valor nil antes de que se inicialicen.
Las variables de instancia en Ruby no necesitan declararse. Esto da lugar a una estructura flexible de los objetos. De hecho, cada variable de instancia se añade dinámicamente al objeto la primera vez que se la referencia
ruby> class InstTest
ruby| def set_foo(n)
ruby| @foo = n
ruby| end
ruby| def set_bar(n)
ruby| @bar = n
ruby| end
ruby| end
nil
ruby> i = InstTest.new
#<InstTest:0x401c3e0c>
ruby> i.set_foo(2)
2
ruby> i
#<InstTest:0x401c3e0c @foo=2>
ruby> i.set_bar(4)
4
ruby> i
#<InstTest:0x401c3e0c @bar=4, @foo=2>
Obsérvese que i no informa del valor de @bar hasta que no se haya llamado al método set_bar