Ruby局部变量未定义

时间:2012-03-12 16:49:10

标签: ruby local-variables

我有以下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 获取相同文件的访问权限。

我的理解有什么问题?

2 个答案:

答案 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_varhello方法。


您可以使用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

示例取自Metaprogramming Ruby

答案 1 :(得分:-7)

local_var是一个局部变量。局部变量在它们定义的范围内是局部的。(这就是为什么它们称为“局部变量”毕竟!)所以很明显,因为local_var是在脚本范围内定义的,您无法在方法范围内访问它。