在test1.rb中有这段代码
my_var = 42
def my_func()
42
end
class MyCLS
attr_accessor :prop
def initialize()
@prop = 42
end
end
Run Code Online (Sandbox Code Playgroud)
然后在解释器中我需要在irb中
> require './test1.rb'
> MyCLS.new().prop
=> 42
> my_func()
=> 42
> my_var
NameError: undefined local variable or method `my_var' for main:Object
Run Code Online (Sandbox Code Playgroud)
我很困惑,ruby似乎很高兴用类和函数来污染全局名称空间,但是拒绝对my_var做同样的事情?我想这是为了避免名称冲突和错误。但是该问题只能部分解决,因为它仍然存在于Class和Function中。也许不那么容易发生?
所以现在想象第二个文件test2.rb
def my_func()
43
end
class MyCLS
attr_accessor :prop
def initialize()
@prop = 43
end
end
Run Code Online (Sandbox Code Playgroud)
然后执行
> require './test1.rb'
> require './test2.rb'
> MyCLS.new().prop
=> 43
> my_func()
=> 43
Run Code Online (Sandbox Code Playgroud)
以前的全局变量MyCLS和my_func被默默覆盖是否正常?这难道不是因为gem决定在某处添加/重命名Class或Function来破坏软件吗?所有这些似乎非常脆弱和危险。
我知道模块,但尝试得很少成功(尴尬,它们又是全局变量)
有什么方法可以防止这种情况或减轻似乎是语言设计的缺陷?
编辑:另一个例子
# test1.rb …Run Code Online (Sandbox Code Playgroud)