【问题标题】:Ruby - Adding value to hash adds duplicate dataRuby - 向哈希添加值会添加重复数据
【发布时间】:2015-08-09 22:59:14
【问题描述】:

当我访问我的嵌套哈希时,会发生一些奇怪的事情。 下面是我的嵌套哈希。

{
  "http://example.com"=>{
     "a-big_word"=>{
        "Another word"=>[]
     }
}, 
  "www.example.com"=>{
     "a-big_word"=>{
        "Another word"=>[]
     }
  }
}

如果我尝试使用以下内容添加一些内容

hash['www.example.com']['a-big_word']['Another word'] << {"key"=>"value"}

发生这种情况

   {
      "http://example.com"=>{
         "a-big_word"=>{
            "Another word"=>[{"key"=>"value"}]
         }
    }, 
      "www.example.com"=>{
         "a-big_word"=>{
            "Another word"=>[{"key"=>"value"}]
         }
      }
    }

【问题讨论】:

  • 您确定键名吗?您说您使用的是hash["www.example.com"]["sublink"]["hi"] 形式,但正确的形式是hash[:"www.example.com"][:sublink][:hi] 看到区别了吗? ...符号!
  • 你可能会受到另一种语言的影响,比如 JavaScript。在 Ruby 中,当键不是符号时,您应该使用运算符 =>。此外,您得到的是嵌套的 Hash 而不是 a multi-dimensional {name goes here}
  • 如果键在引号中,它应该总是[:"key"]吗?我收到 undefined method []=' 为 nil:NilClass`
  • 那就不要用符号了,太麻烦了。我会发布一个答案。
  • @fguillen 我让我的问题和代码示例更容易理解

标签: ruby-on-rails ruby multidimensional-array hash


【解决方案1】:

使用字符串而不是符号作为键。我拿了你的哈希并将键更改为字符串。现在看起来像这样:

{"http://example.com"=>
   {"sublink"=>
      {"A word"=>[], :"Another word"=>[]},
   "sublinktwo"=>
      {"Hello"=>[], "World"=>[]}},
 "www.example.com"=>
   {"sublink"=>
      {"hi"=>[], "goodbye"=>[]},
    "sublinkthree"=>
      {"word"=>[], "bye"=>[]}
   }
}

如果您没有看到区别,我使用=> 而不是:。这样,Ruby 不会将键转换为符号,而是保持原样。

如何访问这些值?查看以下irb 会话。

> hash["www.example.com"]
 => {"sublink"=>{"hi"=>[], "goodbye"=>[]}, "sublinkthree"=>{"word"=>[], "bye"=>[]}}
> hash["www.example.com"]["sublink"]
 => {"hi"=>[], "goodbye"=>[]}
> hash["www.example.com"]["sublink"]["hi"]
 => []

改变值:

> hash["www.example.com"]["sublink"]["hi"] << {"key"=>"value"}
 => [{"key"=>"value"}]

【讨论】:

  • 好的,我将如何动态地将键创建为字符串?我正在循环中创建密钥....例如hash[key] = {}
  • 不确定您的意思...要创建一个新键,只需为 Hash 对象内的该键分配一个值(任何值)。 hash["a key"] = "value" 就像您通常在 JavaScript 中所做的那样(尽管要考虑 ruby​​ 语法)。与 C 或 C++ 不同,Ruby 非常动态,您不必保留内存或其他任何东西来创建新对象。
  • 它似乎对我不起作用。我不知道我做错了什么。我将编辑上面的示例以使其更清晰
  • @MaxRose-Collins 所有示例都经过测试,请检查您的代码或提供更完整的脚本版本。
  • 嗨,对不起,你是对的。我刚刚检查了我是如何构建嵌套哈希的,并且在循环中我使用它两次使用了一些键,所以这就是为什么我将数据放入我假设的哈希的两个部分中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2020-12-09
  • 2012-01-07
  • 2016-02-10
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多