Una variable local tiene un nombre que empieza con una letra minúscula o con el carácter de subrayado (_). Las variables locales no tienen, a diferencia de las variables globales y las variables de instancia, el valor nil antes de la inicialización:
ruby> $foo nil ruby> @foo nil ruby> foo ERR: (eval):1: undefined local variable or method `foo' for #<Object:0x401d2c90> |
Generalmente el ámbito de una variable local es uno de los siguientes:
proc{ ... }
loop{ ... }
def ... end
class ... end
module ... end
Todo el programa (si no es aplicable ninguno de los puntos anteriores)
En el siguiente ejemplo define? es un operador que verifica si un identificador está definido. Si lo está, devuelve una descripción del mismo, en caso contrario, devuelve nil. Como se ve el ámbito de bar es local al bucle, cuando se sale del bucle, bar está sin definir.
ruby> foo =44; print foo, "\n"; defined? foo 44 "local-variable" ruby> loop{bar = 45;print bar, "\n"; break}; defined? var 45 nil |
ruby> bar=0 0 ruby> p1 = proc{|n| bar = n} #<Proc:0x401c3e34> ruby> p2 = proc{bar} #<Proc:0x401c3cf4> ruby> p1.call(5) 5 ruby> bar 5 ruby> p2.call 5 |
Una característica muy poderosa de los objetos procedimiento se deriva de su capacidad para recibir argumentos; las variables locales compartidas permanecen válidas incluso cuando se las pasa fuera de su ámbito original.
Ruby es especialmente inteligente con respecto al ámbito. En el ejemplo, es evidente que la variable contents está compartida por reader y writer. Ahora bien, es posible definir varios pares reader-writer que utilicen box cada uno de los cuales comparten su propia variable contents sin interferir uno con otro.