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)

Tabla 20-2. Variables de sistema

$!Ú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
$nLa 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
$0El 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.