ruby - 解决 3rd 方 gem 代码中的名称冲突

标签 ruby rubygems

我的项目依赖于 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/

相关文章:

ruby - 如何在公司代理后面的 Mac 上安装 Ruby gems?

ruby - 在 Gem 构建中保留空目录

ruby-on-rails - 将 strip 添加到 Rails 应用程序

ruby - 为什么 array.each 内的 ruby​​ array.delete_at 失败?

ruby-on-rails - 在 Ubuntu VPS 上单独运行 RoR

ruby 音节计数器

ruby-on-rails - 使用 RVM 为不同的 Ruby 版本编译 Passenger Native 支持

rubygems - "gem install"和 "bundle install"手动删除 gem 后不安装 gem 依赖项。如何通知 Rubygems gem 已被手动删除?

ruby-on-rails - 如何更改 gem 包管理器版本?

ruby - 混淆 `===` 和 `.===` 的工作