通过<<追加元素时出现意外冻结错误



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

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

,但我被告知该操作是在冷冻元素上执行的:

`&lt;&lt;':无法修改冷冻字符串(Frozenerror(

我想这是因为each产生冷冻对象。我如何重组此代码,以便" .EAT"不提供冷冻变量?

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

new_hash = Hash.new
hash.each do |name , category|
  if new_hash.key?(category)
    new_file[category] << name 
  else
    new_hash[category] = [name] # <- must be an array    
  end
end

我如何重组此代码,以便'.east'不提供冷冻变量?

简短答案:您不能。

Hash#each不"提供冷冻变量"。

首先,没有"冷冻变量"之类的东西。变量没有冻结。对象是。变量和对象之间的区别是基本,不仅在Ruby中,而且在任何编程语言中(实际上也在其他地方(。如果我有一个名称为" seamus"的贴纸,那么这个贴纸不是您。这只是指您的标签。

其次,Hash#each不提供"变量"。实际上,它没有提供任何尚未在哈希中的东西。它只是产生已经在哈希中的对象。

请注意,为了避免混淆和错误,用作钥匙时会自动冻结字符串。因此,您无法修改字符串键。您可以确保它们从一开始是正确的,也可以使用新的字符串键创建一个新的哈希。(您还可以将新密钥添加到现有哈希并删除旧键,但这是很少的收益。(

最新更新