我有一个包含名称和类别的哈希:
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'不提供冻结变量?
答案 0 :(得分:2)
如何重新构造代码,以使'.each'不提供冻结变量?
简短的回答:您不能。
Hash#each
不会“提供冻结变量”。
首先,没有“冻结变量”之类的东西。变量不会冻结。对象是。变量和对象之间的区别是根本,不仅在Ruby中,而且在任何编程语言中(实际上在其他所有地方也是如此)。如果我上面贴有名称为“ Seamus”的标签,则该标签不是您。仅仅是指代您的标签。
第二,Hash#each
不提供“变量”。实际上,它不提供尚未包含在哈希中的任何内容。它只是产生哈希中已经存在的对象。
请注意,为了避免混淆和错误,字符串在用作键时会自动冻结。因此,您不能修改字符串键。您可以从一开始就确保它们是正确的,或者可以使用新的字符串键创建新的哈希。 (您也可以将新的密钥添加到现有的哈希中,并删除旧的密钥,但这很复杂,却没有什么好处。)
答案 1 :(得分:2)
我需要将名字添加到数组中,然后将该数组添加到哈希中。
forecast()