method - La variable local Ruby no está definida
ruby variable $$ (2)
Tengo el siguiente código de Ruby:
local_var = "Hello"
def hello
puts local_var
end
hello
Obtuve 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 fuera del bloque, función, cierre, etc.
Pero ahora definí la variable local en el archivo e intento obtener acceso desde la función DENTRO del mismo archivo.
¿Qué pasa con mi entendimiento?
En las variables locales de Ruby solo accesibles en el ámbito que están definidas. 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 de entrada y salida se llaman Scope Gates. Desde que ingresas a través de Scope Gate a través de la definición del método, no puedes acceder a tu método local_var
inside hello
.
Puede usar el concepto de Aplanamiento de Alcance al pasar 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, puede definir sus clases a través de la Class#New
para que su alcance no cambie cuando pase a través de la definición de la 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, debe usar el Module#New
si desea pasar sus variables locales a través de las compuertas del Módulo.
El ejemplo está tomado de Metaprogramming Ruby
local_var
es una variable local. Las variables locales son locales para el ámbito en el que están definidas. (¡Es por eso que se llaman "variables locales", después de todo!) Así que, obviamente, como local_var
está definido en el ámbito del script, no puede acceder a él en el alcance del método.