7

私のプロジェクトはSunspotに依存しており、Sunspot はprogress_barに依存しています。progress_bar は、 というクラス (モジュール/名前空間の外側) を定義しますProgressBar

私のテスト コードはminitest-reportersに依存しており、これはruby ​​-progressbar に依存しています。ruby-progressbar は と呼ばれるクラス (モジュール/名前空間の外側でも) を定義しますProgressBar

Ruby に慣れていない私は、2 つのProgressBarクラスが競合しているという事実を突き止めるのに非常に時間がかかりました。このような問題を防ぐために自分のコードに名前を付ける方法は知っていますが、サードパーティのコードでこのような衝突を解決する方法はありますか?

更新

minitest-reporters の所有者は、(明らかに放棄された) ProgressBar の使用を、さらに別の進行状況ライブラリであるPowerBarに非常に親切に置き換えました。したがって、これは私の問題に対処しました。しかし、PowerBar はグローバル名前空間も汚染します! これはRubyでは病的と思われます...

4

2 に答える 2

10

あなたが直面している場合

# alice_bad_code.rb

class ProgressBar
  def initialize
    puts "Alice bad code progress bar created"
  end
end

class AliceBadCode
  def initialize
    @progress_bar = ProgressBar.new
  end
end

# bob_bad_code.rb

class ProgressBar
  def initialize
    puts "Bob bad code progress bar created"
  end
end

class BobBadCode
  def initialize
    @progress_bar = ProgressBar.new
  end
end

次に、次のようなことを試します

require "alice_bad_code"
class AliceBadCode
  ProgressBar = ::ProgressBar
end
Object.send(:remove_const, "ProgressBar")

require "bob_bad_code"
class BobBadCode
  ProgressBar = ::ProgressBar
end
Object.send(:remove_const, "ProgressBar") # Just in case

Ruby メタプログラミングへようこそ!

ただし、サードパーティのライブラリにモンキー パッチを適用する最善の方法は、モンキー パッチをまったく適用せず、Jorg W Mittag の回答に従ってバグ レポートを提出することです。

于 2012-07-05T01:55:51.210 に答える
4
  • それがあなた自身のコードにある場合(この特定のケースには当てはまりません):あなたのフリギン定数の名前空間!
  • それが他の誰かのコードにある場合: バグを報告して、彼らのフリギン定数の名前空間を変更するように指示してください! …新しいバージョンがリリースされるのを待ちます…</li>

あなたができることは本当にこれ以上ありません。

于 2012-07-04T23:17:33.167 に答える