gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:57:11 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com