小编Bat*_*ler的帖子

Ruby为什么用类和函数而不是变量污染全局名称空间?

在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)

ruby ruby-on-rails

1
推荐指数
1
解决办法
1303
查看次数

标签 统计

ruby ×1

ruby-on-rails ×1