分享 Hash string key? or symbol key?

hiveer · 2014年08月27日 · 最后由 hiveer 回复于 2014年08月28日 · 4303 次阅读

Hash 既支持 String key,又支持 Symbol key,而且会区别对待。以下形式是合法的 {:one => 1, "one" => 1}

但是更多的时候,我们在意的是组合成 key 的字符,不是他的形式。所以,也就是说实际应用的时候,我们一般不会在一个 hash 中包含两种类型的 key。那我们如何来避免这两种类型的 key 同时出现呢?下面推荐一个方法 http://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html

rgb = ActiveSupport::HashWithIndifferentAccess.new
rgb[:black] = '#000000'
rgb[:black]  # => '#000000'
rgb['black'] # => '#000000'

rgb['white'] = '#FFFFFF'
rgb[:white]  # => '#FFFFFF'
rgb['white'] # => '#FFFFFF'

对于 Hash object 我们也可以很好的通过 Hash#with_indifferent_access 来扩展,快捷,方便!

略麻烦,保持统一方式一直用 symbol 呗

#1 楼 @huacnlee 嗯,对。如果个人能统一风格的话,其实这个就没有多大必要。不过,很多时候都是 coworking,所以实际开发也不好避免。对此,Rails 还有一个扩展方法Hash#with_indifferent_access,可以达到同样的效果,这个在处理 Hash 参数的时候还是挺有用的。

这么做,在某些场合作用非常大,可以避免被坑,如果你设计存储 hash 数据,希望别人访问时只要 key 相同,不论你使用 string key 还是 symbol key 都能获取同一个数据,那么就可以这么干了。

强制 Symbol 方式,团队协作必须要设定标准代码风格吧...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号