Ruby 局部变量未定义

2024-03-28

我有以下 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相同的文件。

我的理解有什么问题吗?


在 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 局部变量未定义 的相关文章

随机推荐