我正在开发一个我认为对更多人有用的宝石,而不仅仅是我。我面临的一个问题是我需要合并嵌套哈希。我发现这个有用的 Gist可以实现这一点,但现在我想知道在 Gem 中像这样修改 Hash# 是否可以?
我确信有一个社区“标准”或最佳实践可以接受或拒绝这种代码,所以我转向 SO 寻求指导。
谢谢你。
我正在开发一个我认为对更多人有用的宝石,而不仅仅是我。我面临的一个问题是我需要合并嵌套哈希。我发现这个有用的 Gist可以实现这一点,但现在我想知道在 Gem 中像这样修改 Hash# 是否可以?
我确信有一个社区“标准”或最佳实践可以接受或拒绝这种代码,所以我转向 SO 寻求指导。
谢谢你。
如有疑问,只需子类Hash
化并将模块包含在您的子类中。当您重写方法或显着改变行为时,您应该特别这样做。
但我不明白为什么你不应该只修改Hash
课程。例如,Rails 严格地扩展了 Core 类,我从未听过有人抱怨。你可以看看 Rails 是如何activesupport
扩展核心类的:
https://github.com/rails/rails/tree/master/activesupport/lib/active_support/core_ext
只需确保不要破坏现有行为,这样 gem 的用户就不会遇到不需要的副作用。
您应该始终有充分的理由扩展核心课程。我会说深度合并是足够好的理由。为深度合并添加新的哈希方法Hash#deep_merge
- 为什么不呢。
但我不认为它证明修改现有方法是合理的——覆盖Hash#merge
以支持深度合并。人们期望这种方法以某种方式运行,如果在需要您的 gem 后它突然出现不同的行为,他们将不会喜欢它。如果您绝对必须这样做,请在文档的显眼位置进行描述。
更新:只需阅读其他答案下的评论。是的,在这种情况下,最好的解决方案就是简单地包括activesupport/lib/active_support/core_ext/hash/deep_merge
:)