我收到此错误:MyModule.rb:4:在getName': undefined local variable or methods'中为MyModule:Module(NameError)
文件1
module MyModule
s = "some name"
def self.getName()
puts s
end
end
Run Code Online (Sandbox Code Playgroud)
文件2
require './MyModule.rb'
include MyModule
MyModule.getName()
Run Code Online (Sandbox Code Playgroud)
这与范围有关,但如果我在方法之前声明它,我不理解为什么会发生这种情况.确实只包含mixin方法而不包含变量?如何更改模块以便打印出我在模块中定义的变量?
7st*_*tud 17
这与范围有关,但我不理解为什么会发生这种情况
A def创建一个新范围.在某些语言中,内部作用域可以在周围范围内看到局部变量 - 但不能在ruby中看到.您可以使用常量代替:
module MyModule
S = "some name"
def getName()
puts S
end
end
include MyModule
getName
--output:--
some name
Run Code Online (Sandbox Code Playgroud)
但是可以从任何地方访问常量:
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
Run Code Online (Sandbox Code Playgroud)
更高级的解决方案涉及使用闭包.与a不同def,块可以看到周围范围内的局部变量,这被称为关闭变量.这是一个例子:
module MyModule
s = "some name"
define_method(:getName) { puts s }
end
include MyModule
getName
--output:--
some name
Run Code Online (Sandbox Code Playgroud)
使用闭包的好处是除了块可以访问s.
确实只包含mixin方法而不包含变量?
这取决于变量的种类:
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)
Run Code Online (Sandbox Code Playgroud)
该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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3080 次 |
| 最近记录: |