我有一个包含名称和类别的哈希:
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
不提供"变量"。实际上,它没有提供任何尚未在哈希中的东西。它只是产生已经在哈希中的对象。
请注意,为了避免混淆和错误,用作钥匙时会自动冻结字符串。因此,您无法修改字符串键。您可以确保它们从一开始是正确的,也可以使用新的字符串键创建一个新的哈希。(您还可以将新密钥添加到现有哈希并删除旧键,但这是很少的收益。(