通过<<附加元素时发生意外的FrozenError

时间:2019-05-14 13:02:45

标签: ruby hash frozen

我有一个包含名称和类别的哈希:

hash = {
  'Dog' => 'Fauna',
  'Rose' => 'Flora',
  'Cat' => 'Fauna'
}

我想重新组织它,以便将名称按其相应类别分组:

{
  'Fauna' => ['Dog', 'Cat'],
  'Flora' => ['Rose']
}

我要通过<<添加每个名称:

new_hash = Hash.new
hash.each do |name , category|
  if new_hash.key?(category)
    new_file[category] << name 
  else
    new_hash[category] = name
  end    
end

但是我被告知此操作是在冻结的元素上执行的:

  

`<<':无法修改冻结的字符串(FrozenError)

我想这是因为each产生冻结的对象。我如何重组该代码,以使'.each'不提供冻结变量?

2 个答案:

答案 0 :(得分:2)

  

如何重新构造代码,以使'.each'不提供冻结变量?

简短的回答:您不能。

Hash#each不会“提供冻结变量”。

首先,没有“冻结变量”之类的东西。变量不会冻结。对象是。变量和对象之间的区别是根本,不仅在Ruby中,而且在任何编程语言中(实际上在其他所有地方也是如此)。如果我上面贴有名称为“ Seamus”的标签,则该标签不是您。仅仅是指代您的标签。

第二,Hash#each不提供“变量”。实际上,它不提供尚未包含在哈希中的任何内容。它只是产生哈希中已经存在的对象。

请注意,为了避免混淆和错误,字符串在用作键时会自动冻结。因此,您不能修改字符串键。您可以从一开始就确保它们是正确的,或者可以使用新的字符串键创建新的哈希。 (您也可以将新的密钥添加到现有的哈希中,并删除旧的密钥,但这很复杂,却没有什么好处。)

答案 1 :(得分:2)

我需要将名字添加到数组中,然后将该数组添加到哈希中。

forecast()