在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
这些进出点被称为范围门.由于您通过方法定义通过范围门进入,所以无法访问local_var
inside 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
.
Example is taken from Metaprogramming Ruby