我有以下Ruby代码:
local_var = "Hello"
def hello
puts local_var
end
hello
我收到以下错误:
local_variables.rb:4:in 'hello': undefined local variable or method 'local_var'
for main:Object (NameError) from local_variables.rb:7:in '<main>'
我一直认为局部变量不能从块外部,函数,闭包等中访问。
但是现在我在文件中定义了局部变量,并尝试从函数 INSIDE 获取相同文件的访问权限。
我的理解有什么问题?
答案 0 :(得分:52)
在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
方法。
您可以使用Scope Flattening概念将变量传递到这些门。
例如,您可以使用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
。
答案 1 :(得分:-7)
local_var
是一个局部变量。局部变量在它们定义的范围内是局部的。(这就是为什么它们称为“局部变量”毕竟!)所以很明显,因为local_var
是在脚本范围内定义的,您无法在方法范围内访问它。