【问题标题】:Is it bad to completely replace Hash with HashWithIndifferentAccess in Ruby?在 Ruby 中用 HashWithIndifferentAccess 完全替换 Hash 是不是很糟糕?
【发布时间】:2026-02-04 13:30:01
【问题描述】:

我发现自己经常遇到错误,我使用符号而不是字符串访问哈希,反之亦然。我想做:

require 'active_support/hash_with_indifferent_access'
Hash = HashWithIndifferentAccess
# (irb):xx: warning: already initialized constant Hash

这个警告是因为已经定义了 Hash,但我并不在意。

当然,性能可能会稍差。

当然,也许某些 gem 创建了一个带有字符串和符号的散列并且会中断——但这有多常见?

这很糟糕吗?反模式?我会后悔这样做吗?有什么缺点?这样做有什么好的/坏的经验吗?

【问题讨论】:

  • 你为什么首先尝试使用字符串访问哈希?符号是明显的赢家。
  • @ArslanAli 在旧版本的 Ruby 中,符号不会被垃圾收集。使用 JSON 解码或类似的方法时,很容易用大量符号污染符号表,而您无法控制定义了多少符号。
  • 你想阅读别人的代码吗?这相当于添加alias :kat :cat,因为不会拼写。

标签: ruby-on-rails ruby hash activesupport


【解决方案1】:

你认为{}.class 会在你的杂牌之后做什么?对,应该是Hash

你认为Hash[:a, 'a'] 会做什么?对,SystemStackError,原因很明显。

所以是的,这是一个坏主意,你会后悔的,而且一个重要的缺点是它实际上并没有达到你认为的效果。

【讨论】:

  • 有什么想法可以让 Ruby Hash 默认对用户更友好吗?我真的看不出像Hash[:a, 'a', 'a', :a] 这样的案例的充分理由。
  • 嗯,不考虑一下吗?我实际上从来没有遇到过符号/字符串问题,所以我看不出有什么意义。当你用 Ruby 编程时,用 Ruby 编程,而不是看起来像 Ruby 的东西。
【解决方案2】:

最大的缺点是您使哈希函数变为 O(n) 而不是 O(1)。比较字符串比比较符号的要求要高得多,所以我认为这会对性能造成重大影响。

在使用符号访问哈希时,您不应该真的遇到错误,因为它们与字符串非常相似,也许阅读这篇文章会有所帮助:Differences between symbols and strings

【讨论】:

最近更新 更多