在 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
method.
您可以使用范围扁平化概念将变量通过这些门。
例如,而不是使用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 https://rads.stackoverflow.com/amzn/click/com/1934356476