修改gem中的核心类

时间:2012-07-11 08:49:09

标签: ruby gem

我正在开发一种宝石,我认为这对于更多人而言不仅仅对我有用。我面临的一个问题是我需要合并嵌套的哈希。我找到了this useful Gist来实现这一目标,但现在我想知道是否可以在Gem中修改Hash#这样吗?

我确信有一个社区“标准”或最佳做法可以接受或拒绝这类代码,所以我转向SO寻求指导。

谢谢。

2 个答案:

答案 0 :(得分:5)

如果有疑问,只需子类Hash并在您的子类中包含Module。当您重写方法或显着改变行为时,您应该特别这样做。

但我不明白为什么你不应该只修改Hash类。例如,Rails严格扩展了Core类,我从未听过有人抱怨过。您可以看看Rails'activesupport如何扩展核心类:

https://github.com/rails/rails/tree/master/activesupport/lib/active_support/core_ext

请确保不要破坏现有行为,因此宝石的用户不会遇到不必要的副作用。

答案 1 :(得分:3)

你应该总是有充分的理由来扩展核心课程。我认为深度合并是足够好的理由。为Hash#deep_merge等深度合并添加新的Hash方法 - 为什么不呢。

但我不相信修改现有方法是合理的 - 覆盖Hash#merge以支持深度合并。人们希望这种方法能够以某种方式运行,如果它在需要你的宝石之后突然表现得不同,他们就不会喜欢它了。如果您绝对必须这样做,请在文档中的显着位置进行描述。

更新:只需阅读其他答案下的评论。是的,在这种情况下,最好的解决方案就是包含activesupport/lib/active_support/core_ext/hash/deep_merge:)