Ruby on rails Ruby-向哈希中添加值会添加重复数据

Ruby on rails Ruby-向哈希中添加值会添加重复数据,ruby-on-rails,ruby,multidimensional-array,hash,Ruby On Rails,Ruby,Multidimensional Array,Hash,当我访问嵌套哈希时,会发生一些奇怪的事情。 下面是我的嵌套哈希 { "http://example.com"=>{ "a-big_word"=>{ "Another word"=>[] } }, "www.example.com"=>{ "a-big_word"=>{ "Another word"=>[] } } } 如果我尝试用下面的内容添加一些内容 hash['www.

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

{
  "http://example.com"=>{
     "a-big_word"=>{
        "Another word"=>[]
     }
}, 
  "www.example.com"=>{
     "a-big_word"=>{
        "Another word"=>[]
     }
  }
}
如果我尝试用下面的内容添加一些内容

hash['www.example.com']['a-big_-word']['other word']]value}

这种情况会发生

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

使用字符串而不是符号作为键。我把你的散列改成了字符串。现在看起来是这样的:

{"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"}]
>哈希[“www.example.com”][“sublink”][“hi”]“value”}
=>[{“键”=>“值”}]

您确定密钥名称吗?您说您使用的是
hash[“www.example.com”][“sublink”][“hi”]
,但是正确的形式是
hash[:“www.example.com”][:sublink][:hi]
看到区别了吗。。。符号!您可能会受到另一种语言的影响,如JavaScript。在Ruby中,当键不是符号时,应该使用操作符
=>
。另外,您得到的是一个嵌套的
散列
,而不是
多维
{code>{name goes here}如果键在引号中,那么它应该始终是
[:“key”]
?对于nil:NilClass,我得到了
未定义的方法
[]=',不要使用符号,这太麻烦了。我将发布一个答案。@fguillen我已经使我的问题和代码示例更容易理解了,我将如何动态地将键创建为字符串?我正在创建循环中的关键点。。。。e、 g.
hash[key]={}
不知道你的意思。。。要创建一个新键,只需在
散列
对象中为该键分配一个值(任意值)<代码>散列[“一个键”]=“值”,就像您在JavaScript中通常所做的那样(尽管考虑到ruby语法)。露比是非常动态的,不像C或C++,你不需要保留内存或任何其他东西来创建新的对象。它似乎对我来说不起作用。我不知道我做错了什么。我将对上面的示例进行编辑,以使其更详细clear@MaxRose-柯林斯:所有的例子都经过测试,请检查你的代码或把你的脚本的更完整的版本。嗨,对不起,你是对的。我只是检查了我是如何构建嵌套哈希的,在循环中我使用它两次使用了一些键,所以我假设我将数据放入哈希的两个部分?