7

我的项目依赖于Sunspot,而后者又依赖于progress_bar。progress_bar 定义了一个名为ProgressBar.

我的测试代码依赖于minitest-reporters,而 minitest-reporters 又依赖于ruby ​​-progressbar 。ruby-progressbar 定义了一个名为ProgressBar.

ProgressBar作为 Ruby 的新手,我花了很长时间才找到两个类冲突的事实。我知道如何命名我自己的代码以防止此类问题,但是有没有办法解决第 3 方代码中的此类冲突?

更新

minitest-reporters 的所有者非常友好地用另一个进度库PowerBar替换了他对(显然被放弃的)ProgressBar 的使用。所以这解决了我的问题。但是你猜怎么着——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 元编程!

However, the best way to monkey patch a third-party library is not to monkey patch it at all, and file a bug report as per Jorg W Mittag's answer.

于 2012-07-05T01:55:51.210 回答
4
  • 如果它在您自己的代码中(在这种特殊情况下不适用):命名您的 friggin 常量!
  • 如果它在其他人的代码中:提交一个错误,告诉他们为他们的 friggin 常量命名!……等待他们发​​布新版本……</li>

你真的无能为力了。

于 2012-07-04T23:17:33.167 回答