我的项目取决于Sunspot,而后者又取决于progress_bar。 progress_bar定义了一个名为ProgressBar
的类(在任何模块/命名空间之外)。
我的测试代码取决于minitest-reporters,ruby-progressbar依赖于PowerBar。 ruby-progressbar定义了一个名为ProgressBar
的类(也在任何模块/命名空间之外)。
对Ruby不熟悉,我花了很多时间来追踪这两个ProgressBar
类是冲突的事实。我知道如何命名我自己的代码来防止这样的问题,但有没有办法解决第三方代码中的这种冲突?
更新:
minitest-reporter的所有者非常善意地将他对(显然已放弃的)ProgressBar的使用替换为另一个进度库{{3}}。所以这解决了我的问题。但是猜猜 - PowerBar还会污染全局命名空间!这似乎在Ruby中是病态的......
答案 0 :(得分: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的回答提交错误报告。
答案 1 :(得分:4)
你真的不能做更多。