Ruby Hash 和 ActiveSupport HashWithIndifferentAccess 的区别
Posted
技术标签:
【中文标题】Ruby Hash 和 ActiveSupport HashWithIndifferentAccess 的区别【英文标题】:Difference between Ruby’s Hash and ActiveSupport’s HashWithIndifferentAccess 【发布时间】:2015-10-31 16:02:56 【问题描述】:Ruby 的 Hash
和 ActiveSupport 的 HashWithIndifferentAccess
有什么区别?哪个最适合动态哈希?
【问题讨论】:
【参考方案1】:在 Ruby 哈希中:
hash[:key]
hash["key"]
不一样。在HashWithIndifferentAccess
中,顾名思义,您可以通过任一方式访问key
。
在此引用官方documentation:
实现一个哈希,其中键 :foo 和 "foo" 被认为是 一样。
和
内部符号在用作键时映射到字符串 整个书写界面(调用[]=,合并等)。这个映射 属于公共接口。例如,给定:
hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1)
你是 保证密钥作为字符串返回:
hash.keys # => ["a"]
【讨论】:
我认为在 HashWithIndifferentAccess 的情况下,在整个书写界面(调用 []=、merge 等)中用作键时,符号会映射到字符串。对吗? 是的。当在整个书写界面中用作键时(调用 []=、merge 等),内部符号被映射到字符串。此映射属于公共接口。【参考方案2】:下面是一个简单的示例,它将向您展示简单的 ruby 哈希和“ActiveSupport::HashWithIndifferentAccess”之间的区别
HashWithIndifferentAccess 允许我们以符号或字符串的形式访问哈希键简单的 Ruby 哈希
$ irb
2.2.1 :001 > hash = a: 1, b:2
=> :a=>1, :b=>2
2.2.1 :002 > hash[:a]
=> 1
2.2.1 :003 > hash["a"]
=> nil
ActiveSupport::HashWithIndifferentAccess
2.2.1 :006 > hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1, b:2)
NameError: uninitialized constant ActiveSupport
from (irb):6
from /home/synerzip/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'
2.2.1 :007 > require 'active_support/core_ext/hash/indifferent_access'
=> true
2.2.1 :008 > hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1, b:2)
=> "a"=>1, "b"=>2
2.2.1 :009 > hash[:a]
=> 1
2.2.1 :010 > hash["a"]
=> 1
HashWithIndifferentAccess 类继承自 ruby "Hash" 并在其中添加了上述特殊行为。
【讨论】:
以上是关于Ruby Hash 和 ActiveSupport HashWithIndifferentAccess 的区别的主要内容,如果未能解决你的问题,请参考以下文章
使用 Ruby on Rails ActiveSupport::Concern 功能时如何“嵌套”包含模块?
ActiveSupport 3 中 #<Hash:0x3d3cef0> (NoMethodError) 的未定义方法 `to_json'
ruby open类的自定义rails日志:ActiveSupport :: Logger :: SimpleFormatter
ruby 更改Rails 3.2.13和4.0如何在JSONMonkey修补程序ActiveSupport中编码unicode以恢复to_json unicode字符编码。