variable method globales ruby local-variables

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.