【问题标题】:Difference between Ruby’s Hash and ActiveSupport’s HashWithIndifferentAccessRuby Hash 和 ActiveSupport HashWithIndifferentAccess 的区别
【发布时间】:2015-10-31 16:02:56
【问题描述】:

Ruby 的 Hash 和 ActiveSupport 的 HashWithIndifferentAccess 有什么区别?哪个最适合动态哈希?

【问题讨论】:

    标签: ruby-on-rails ruby hash activesupport


    【解决方案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" 并在其中添加了上述特殊行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      相关资源
      最近更新 更多