2016-12-31 20 views
4

ルビーでは、いくつかの宝石は「グローバルな名前空間を汚染する」ことを選択します。「グローバル名前空間を汚染する」とはどういう意味ですか?

これはどういう意味ですか?
どのように起きているのでしょうか?
なぜこれを行う必要があるのでしょうか?

グローバルな名前空間と矛盾している2つの宝石に直面すると、私が「分離する」ことを選択するとき、私はどのようなトレードオフをしていますか?例えば

:私は両方のグローバルな名前空間を汚染されている2つの宝石を使用してい

prygliはので、私はもう私の欲しいbinding.pry Sを配置することはできませんよ。

一つsolutionは、モジュール全体CLIをラップすることです:

module Wrapper 
    include GLI::App 

    extend self 
    program_desc "..." 
    ... 

    exit run ARGV 
end 

は、今私は私が好きな場所私のbinding.pry Sを使用することができますよ。

これはなぜ機能しましたか?
「gliを分離する」ことを選択したとき、私はどのようなトレードオフをしていますか?それとも、「GLI::Appモジュールを分離するのですか?

答えて

1

Rubyには、すべてのコードで共有される特異なルート名前空間があります。そこに定義する定数やグローバルは、アプリケーション全体で共通です。名前空間に注意を払わないと、これは矛盾を避けられません。

構造体は名前空間プリミティブとして存在し、すべての定数はその中で定義されたすべてのクラスに対してローカルになります。あなたが望むならば、クラスは名前空間として使うこともできます。それはあなた次第です。

includeをルート名前空間に強制することは大きな問題です。これは、通常、非常に小さく自己完結したクイックスクリプトでのみ行われます。それは、それらの2つのコンテキストですべての定数とメソッドを一緒にマッシュアップし、潜在的にそれらを上書きするときに、あなたが何か自明でないことをしているときに入り込む悪い習慣です。

+0

なぜ、2つの小さなプロジェクトで、PryやGLIがグローバルな名前空間を汚染してしまうのですか? – mbigras

+1

'pry'のようなものでピンを引っ張ると、' irb'のようにRubyを基本的に制御しますが、うまく動作するとは考えられません。条件付きで起動する必要がある場合、あなたのアプローチはほとんど有効と思われます。 – tadman

関連する問題