Ruby局部变量未定义

z9smfwbn  于 2023-01-04  发布在  Ruby
关注(0)|答案(3)|浏览(147)

我有下面的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中访问同一个文件。
我的理解有什么问题?

zqry0prt

zqry0prt1#

在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

这些进入和离开点被称为范围门,因为你是通过方法定义进入范围门的,所以你不能在hello方法内部访问你的local_var
您可以使用范围扁平化概念将变量传递通过这些门。
例如,您可以使用Module#define_method来定义方法,而不是使用def

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

e4yzc0pl

e4yzc0pl2#

确保函数接受参数,并在调用时将对象作为参数之一添加

local_var = "Hello"

def hello(some_local_var)
  puts local_var
end

hello(local_var)
6yt4nkrj

6yt4nkrj3#

local_var是一个局部变量。局部变量对于它们定义的作用域来说是局部的。(这就是为什么它们被称为“局部变量”!)所以,很明显,由于local_var是在脚本作用域中定义的,所以您不能在方法作用域中访问它。

相关问题