有一段时间,xml-simple gem对我来说工作得很好(间接地,通过另一个gem)。
但最近我不得不安装亚马逊S3 gem。亚马逊的人认为xml-simple不够酷,所以他们提供了一个替代品:“faster-xml-simple”。他们还决定现在每个人都想使用他们的代码,所以他们这样做:
class XmlSimple # :nodoc:
def self.xml_in(*args)
FasterXmlSimple.xml_in *args
end
end但是两个宝石在行为和选择上有很大的不同。现在,每次我调用XmlSimple.xml_in时,我都会转到亚马逊的版本。
有没有办法阻止gem A(亚马逊S3)重写gem B的方法(xml-simple)?或者让亚马逊的改变只出现在亚马逊的宝石上?例如,当部署在Heroku上时,它工作得很好。
谢谢!
发布于 2010-09-16 07:51:19
Ruby有开放的类,这意味着任何人都可以在任何时候修改任何类。没有办法阻止这一点。像你描述的这样的问题正是为什么每本手册,每一篇教程,每门课程,每一个常见问题解答都教你不要这么做的原因。
在过去的10年左右,人们一直在谈论将选择器名称空间添加到Ruby 2.0中,以提供词法范围内的猴子补丁。最近,马茨将目光投向了。看起来Ruby 2.0很可能会提供类盒来限制猴子补丁的范围,但在此之前,您最好的办法是向该库的作者提交一个bug。
https://stackoverflow.com/questions/3722521
复制相似问题