解决第三方gem代码中的名称冲突

Geo*_*old 7 ruby rubygems

我的项目依赖于太阳黑子,太阳黑子依赖于progress_bar.progress_bar定义了一个被调用的类(在任何模块/命名空间之外)ProgressBar.

我的测试代码依赖于minitest-reporter,而后者依赖于ruby-progressbar.ruby-progressbar定义了一个类(也在任何模块/命名空间之外)ProgressBar.

作为Ruby的新手,我花了很多时间来追踪这两个ProgressBar类是冲突的事实.我知道如何命名我自己的代码来防止这样的问题,但有没有办法解决第三方代码中的这种冲突?

更新:

minitest-reporter的所有者非常友好地将他对(显然已被遗弃的)ProgressBar的使用替换为另一个进度库PowerBar.所以这解决了我的问题.但是猜猜 - PowerBar还会污染全局命名空间!这似乎在Ruby中是病态的......

And*_*imm 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
Run Code Online (Sandbox Code Playgroud)

# 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
Run Code Online (Sandbox Code Playgroud)

然后我会尝试类似的东西

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
Run Code Online (Sandbox Code Playgroud)

欢迎来到Ruby元编程!

但是,修补第三方库的最佳方法是不要对其进行修补,并按照Jorg W Mittag的回答提交错误报告.


Jör*_*tag 5

    \n
  • 如果它在您自己的代码中(在这种特殊情况下不适用):为您的常量命名空间!
  • \n
  • 如果它在别人的代码中:提交一个错误,告诉他们给他们的该死的常量命名空间!\xe2\x80\xa6 并等待他们发​​布新版本 \xe2\x80\xa6
  • \n
\n\n

你真的无能为力。

\n

  • 这并不总是一个选择,也不能真正回答问题。 (2认同)