3

我正在开发一个我认为对更多人有用的宝石,而不仅仅是我。我面临的一个问题是我需要合并嵌套哈希。我发现这个有用的 Gist可以实现这一点,但现在我想知道在 Gem 中像这样修改 Hash# 是否可以?

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

谢谢你。

4

2 回答 2

5

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

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

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

只需确保不要破坏现有行为,这样 gem 的用户就不会遇到不需要的副作用。

于 2012-07-11T08:54:21.803 回答
3

您应该始终有充分的理由扩展核心课程。我会说深度合并是足够好的理由。为深度合并添加新的哈希方法Hash#deep_merge- 为什么不呢。

但我不认为它证明修改现有方法是合理的——覆盖Hash#merge以支持深度合并。人们期望这种方法以某种方式运行,如果在需要您的 gem 后它突然出现不同的行为,他们将不会喜欢它。如果您绝对必须这样做,请在文档的显眼位置进行描述。

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

于 2012-07-11T09:26:45.040 回答