Capítulo 20. Variables

Tabla de contenidos
Variables globales
Variables de instancia
Variables locales

Ruby tiene tres clases de variables, una clase de constante y exactamente dos pseudo-variables. Las variables y las constantes no tienen tipo. Aunque las variables sin tipo tienen sus inconvenientes, presentan más ventajas y se adaptan mejor a la filosofía rápido y sencillo de Ruby

En la mayoría de los lenguajes hay que declarar las variables para especificar su tipo, si se pueden modificar (e.g. si son constantes) e indicar su ámbito, ya que no es ningún problema el tipo y como vamos a ver, el resto se obtiene a partir del nombre, en Ruby no se necesita declarar las variables.

El primer carácter de un identificador lo cataloga de un plumazo:

Tabla 20-1. Clases de variables

$Variable global
@Variable instancia
[a-z] ó _Variable local
[A-Z]Constante

Las únicas excepciones a lo expuesto en la tabla son las pseudo-variables de Ruby: self, que referencia al objeto que está en ese momento en ejecución y nil que es el valor nulo que toman las variables no inicializadas. Ambos tienen un identificador como de variable local pero self es una variable global que la mantiene el interprete y nil es una constante. Como estas son las únicas excepciones no provocan mucha confusión.

No se debe asignar valores a self y nil principalmente porque un valor de self referencia al objeto de nivel superior:

  ruby> self
  main
  ruby> nil
  nil
  

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 interprete 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-esima 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 interprete Ruby
$?Estado de retorno del último proceso hijo ejecutado

De las variables anteriores $_ y $~, tienen ámbito local. Su 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.