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
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
porque otros lenguajes de programación son diferentes – shevchyk
try @local_var = "Hola" –