【问题标题】:What does it mean to "pollute the global namespace"?“污染全局命名空间”是什么意思?
【发布时间】:2017-05-15 08:46:36
【问题描述】:

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

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

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

例如:

我正在使用两个都污染全局命名空间的 gem:prygli,所以我无法再将我的 binding.prys 放在我想要的位置。

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

module Wrapper
  include GLI::App

  extend self
  program_desc "..."
  ...

  exit run ARGV
end

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

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

【问题讨论】:

    标签: ruby rubygems pry global-namespace


    【解决方案1】:

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

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

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

    【讨论】:

    • 为什么像 pry 和 GLI 这样两个不那么小的项目会选择污染全局命名空间?
    • 当你拉动像pry 这样的引脚时,像irb 它基本上控制了Ruby,它不会表现得很好。如果您需要有条件地启动它,您的方法似乎大多有效。
    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多