“污染全球命名空间”是什么意思?

时间:2016-12-31 08:01:26

标签: ruby rubygems pry global-namespace

在ruby中,一些宝石选择“污染全局命名空间”。

这是什么意思?
我怎么能看到它发生在哪里? 为什么宝石需要这样做?

当面对两个污染全局命名空间和冲突的宝石时,我选择“隔离”一个时会做出什么权衡?

例如:

我正在使用两个同时污染全局命名空间的宝石:prygli所以我无法将binding.pry放在我想要的位置。

一个solution是将整个cli包装在一个模块中:

module Wrapper
  include GLI::App

  extend self
  program_desc "..."
  ...

  exit run ARGV
end

现在我可以在任何我想要的地方使用binding.pry

为什么这样做?
当我选择“隔离gli”时,我做了什么权衡?或者是“隔离GLI::App模块”?

1 个答案:

答案 0 :(得分:1)

Ruby有一个由所有代码共享的单一根命名空间,您定义的任何常量和全局变量在整个应用程序中都是通用的。如果你不小心命名空间,这就会使冲突不可避免。

module构造作为名称空间原语,所有常量都是本地的,所有类都在其中定义。如果您愿意,也可以将类用作命名空间,这取决于您。

将某些内容的include强制转换为根命名空间是一个很大的问题。这通常只能在相当小且独立的快速脚本中完成。当你做任何非平凡的事情时,这是一个坏习惯,因为它将这两个上下文中的所有常量和方法混合在一起,可能会过度编写它们。