gpt4 book ai didi

Ruby 局部变量未定义

转载 作者:数据小太阳 更新时间:2023-10-29 06:23:42 24 4
gpt4 key购买 nike

我有以下 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>'

我一直认为局部变量不能从 block 、函数、闭包等外部访问。

但现在我在文件中定义了局部变量,并尝试从 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

这些进入点和离开点称为范围门。由于您通过方法定义进入范围门,因此您无法在 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

关于Ruby 局部变量未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9671259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com