私が書いたコードと衝突するトップレベルのクラスを定義するgemがあれば、すべてのクラスがモジュール内でグループ化されるようにgemを要求することは可能でしょうか?私は定義することができますか?Ruby gemをユーザー定義のネームスペースにロードする
Word.new # => The class I defined.
SafeContainer::Word.new # => The class defined by the gem.
いくつかの詳細:を私は区別できるように
class Word
# My word class.
end
module SafeContainer
# This obviously doesn't work
# (i.e. the gem still defines ::Word).
require 'unsafe_gem'
end
:たとえば、unsafe_gemがクラスを定義する場合:
class Word
# ... some code
end
私のようなものが必要になります私のコード(例えば、 'Word'クラス)は既に独自の名前空間にラップされています。しかし、私は、トップレベルの名前空間の下で直接アクセスできるいくつかのクラスを作成する、 "構文的な砂糖"のフォームを有効にするオプションをユーザに提供できるようにしたい。しかしこれは、私が使用しているトップクラスのクラスを定義する宝石と名前の衝突を作り出します。現在提案されているソリューションのどれも、宝石がそこに存在する世界的に定義されたクラスに実際に頼っているため動作しません。クラスの定義を解除すると宝石が壊れます。もちろん、この宝石には複数のファイルがあり、モジュールにファイルを個別に要求することは非常に脆弱な解決策です。現在、私が発見した唯一の回避策はこれです:
begin
# Require the faulty gem.
require 'rbtagger'
rescue
# If syntactic sugar is enabled...
if NAT.edulcorated?
# Temporarily remove the sugar for the clashing class.
Object.const_unset(:Word); retry
else; raise; end
ensure
# Restore syntactic sugar for the clashing class.
if NAT.edulcorated?
Object.const_set(:Word, NAT::Entities::Word)
end
end
私はなぜ知らないが、これは私の足の爪がカールます。誰かがより良い解決策を持っていますか?