В Ruby локальные переменные доступны только в той области, в которой они определены.Всякий раз, когда вы входите / выходите из Класса, Модуля или Метода, определяющих вашу область, изменяется в Ruby.
Например:
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
Эти точки входа и выхода называются Вратами Области.Поскольку вы входите через Scope Gate через определение метода, вы не можете получить доступ к своему local_var
внутри hello
методу.
Вы можете использовать концепцию выравнивания области для передачи вашей переменной через эти ворота.
Например, вместо использования def
для определения вашего метода вы можете использовать Module#define_method
.
local_var = "Hello"
define_method :hello do
puts local_var
end
Таким же образом вы можете определять свои классы с помощью Class#New
, чтобы ваша область действия не изменялась привы проходите через определение класса.
local_var = 'test'
MyClass = Class.new do
puts local_var #valid
end
вместо
class MyClass
puts local_var #invalid
end
Таким же образом вы должны использовать Module#New
, если вы хотите передать свои локальные переменные через ворота модуля.
Пример взят из Метапрограммирование Ruby