2012-03-12 21 views
34

tengo el siguiente código Ruby:Rubí variable local no está definido

local_var = "Hello" 

def hello 
    puts local_var 
end 

hello 

me sale el siguiente error:

local_variables.rb:4:in 'hello': undefined local variable or method 'local_var' 
for main:Object (NameError) from local_variables.rb:7:in '<main>' 

siempre pensé que las variables locales no son accesibles desde el exterior del bloque, función, cierre, etc.

Pero ahora definí la variable local en el archivo e intento obtener un acceso desde la función DENTRO la s ame archivo

¿Qué hay de malo en mi entendimiento?

+1

Usted dijo "Siempre pensé que las variables locales no son accesibles desde fuera de la función". Entonces, ¿por qué te sorprende que tu variable local solo esté mirando dentro de la función en la línea 'puts'? – Gareth

+4

porque otros lenguajes de programación son diferentes – shevchyk

+1

try @local_var = "Hola" –

Respuesta

51

En Ruby variables locales solo accesibles en el ámbito que se definen. Cada vez que ingresa/abandona una clase, un módulo o una definición de método, su alcance cambia en Ruby.

Por ejemplo:

v1 = 1 

class MyClass # SCOPE GATE: entering class 
    v2 = 2 
    local_variables # => ["v2"] 

    def my_method # SCOPE GATE: entering def 
    v3 = 3 
    local_variables # => ["v3"] 
    end # SCOPE GATE: leaving def 

    local_variables # => ["v2"] 
end # SCOPE GATE: leaving class 

Estos puntos que entran y salen son llamados Ámbito Gates. Como ingresa a través de Scope Gate a través de la definición del método, no puede acceder a su local_var dentro del método hello.


Puede utilizar el concepto de aplanamiento de alcance, pase su variable a través de estas puertas.

Por ejemplo, en lugar de usar def para definir su método, puede usar Module#define_method.

local_var = "Hello" 

define_method :hello do 
    puts local_var 
end 

De la misma manera se puede definir a través de sus clases Class#New para que su alcance no cambia cuando se pasa a través de la definición de clase.

local_var = 'test' 

MyClass = Class.new do 
    puts local_var #valid 
end 

en lugar de

class MyClass 
    puts local_var #invalid 
end 

De la misma manera se debe utilizar Module#New si desea pasar sus variables locales a través de puertas del módulo.

Ejemplo se toma de Metaprogramming Ruby

-7

local_var es una variable local. Las variables locales son locales para el ámbito en el que están definidas. (¡Por eso son llamadas "variables locales", después de todo!) Así que, obviamente, dado que local_var se define en el ámbito del script, no se puede acceder en el ámbito del método .

+20

Si estoy en un automóvil y tengo un cambio en mi bolsillo, hay un cambio en el automóvil. Muchos otros lenguajes envían variables locales a ámbitos internos, por lo que no hay razón para considerar el comportamiento de Ruby como evidente. –

+0

@AdamTolley, tienes toda la razón, pero supongo que Ruby podría ser el primer idioma de Jorg y el alcance puede parecer obvio para él. –

+0

@AlexanderSuraphel: En realidad, se trataba de mi decimoquinto idioma, aunque para cuando escribí esa respuesta, probablemente ya había subido otra docena más o menos. Realmente no hago un seguimiento. –