gpt4 book ai didi

Ruby:如何访问模块局部变量?

转载 作者:数据小太阳 更新时间:2023-10-29 07:21:02 25 4
gpt4 key购买 nike

我得到这个错误:MyModule.rb:4:in getName': undefined local variable or methods' for MyModule:Module (NameError)

文件1

module MyModule
s = "some name"
def self.getName()
puts s
end
end

文件2

require './MyModule.rb'

include MyModule
MyModule.getName()

这与范围有关,但如果我在方法之前声明它,我不理解为什么会发生这种情况。只包含 mixin 方法而不包含变量?如何更改我的模块,以便它可以打印出我在模块中定义的变量?

最佳答案

This has something to do with scope, but I'm not comprehending why this is happening

def 创建一个新的作用域。在某些语言中,内部作用域可以看到周围作用域中的局部变量——但在 ruby​​ 中则不行。您可以改用常量:

module MyModule
S = "some name"

def getName()
puts S
end
end

include MyModule

getName

--output:--
some name

但是可以从任何地方访问常量:

module MyModule
S = "some name"

def getName()
puts S
puts Dog::S
end
end

module Dog
S = "hello"
end

include MyModule

getName

--output:--
some name
hello

更高级的解决方案涉及使用闭包。与 def 不同, block 可以看到周围范围内的局部变量,这被称为对变量的关闭。这是一个例子:

module MyModule
s = "some name"
define_method(:getName) { puts s }
end

include MyModule

getName

--output:--
some name

使用闭包的优点是只有 block 可以访问s

does include only mixin methods and not variables?

这取决于变量的种类:

module MyModule
A = 'hello'
s = 'goodbye'
end

include MyModule

puts A
puts s

--output:--
hello

1.rb:9:in `<main>': undefined local variable or method `s' for main:Object (NameError)

module 关键字,如 def,创建一个新的作用域。你知道方法执行结束时局部变量是如何销毁的吗?当一个模块完成执行时,它的局部变量也会被销毁:

module MyModule
puts "MyModule is executing"
s = 'goodbye'
end

include MyModule

puts s

--output:--
MyModule is executing

1.rb:7:in `<main>': undefined local variable or method `s' for main:Object (NameError)

关于Ruby:如何访问模块局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18371822/

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