我正在开发一种宝石,我认为这对于更多人而言不仅仅对我有用。我面临的一个问题是我需要合并嵌套的哈希。我找到了this useful Gist来实现这一目标,但现在我想知道是否可以在Gem中修改Hash#这样吗?
我确信有一个社区“标准”或最佳做法可以接受或拒绝这类代码,所以我转向SO寻求指导。
谢谢。
答案 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
:)