我的项目依赖于 Sunspot ,这又取决于 progress_bar . progress_bar 定义了一个名为 ProgressBar
的类(在任何模块/命名空间之外)。
我的测试代码依赖minitest-reporters ,这又取决于 ruby-progressbar . ruby-progressbar 定义了一个名为 ProgressBar
的类(也在任何模块/命名空间之外)。
作为 Ruby 的新手,我花了很长时间才找到两个 ProgressBar
类冲突的事实。我知道如何命名我自己的代码以防止出现此类问题,但是有什么方法可以解决第三方代码中的此类冲突吗?
更新:
minitest-reporters 的所有者非常友好地用另一个进度库 PowerBar 替换了他对(显然已废弃的)ProgressBar 的使用。 .所以这解决了我的问题。但是你猜怎么着——PowerBar 也污染了全局命名空间!这在 Ruby 中似乎是病态的......
最佳答案
如果你遇到了
# 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 的回答提交错误报告。
关于ruby - 解决 3rd 方 gem 代码中的名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335807/