"pollute the global namespace" 是什么意思?

What does it mean to "pollute the global namespace"?

在ruby中,部分gem选择"pollute the global namespace"。

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

当面对两个污染全局命名空间并相互冲突的 gem 时,当我选择 "isolate" 一个时我要做出哪些权衡?

例如:

我正在使用两个 gems,它们都在污染全局命名空间:pry and gli 所以我无法再将我的 binding.prys 放在我想要的地方。

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

module Wrapper
  include GLI::App

  extend self
  program_desc "..."
  ...

  exit run ARGV
end

现在我可以随时随地使用我的 binding.pry

为什么这样做?
当我选择 "isolate gli" 时,我在做哪些权衡?还是 "isolate the GLI::App module"?

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

module 结构是作为命名空间原语存在的,所有常量都是局部的,所有 class 都是在其中定义的。如果愿意,您也可以使用 class 作为命名空间,这取决于您。

将某些内容强制 include 放入根名称空间是个大问题。这通常只能在相当小且独立的快速脚本中完成。当你做任何重要的事情时,这是一个坏习惯,因为它把这两个上下文中的所有常量和方法混在一起,可能会覆盖它们。