2016-09-29 5 views
2

Я хочу вставить несколько хэшей в массив, который создаст массив хэшей. Но каждый раз, когда я добавляю новый хэш в массив, он перезаписывает предыдущие. Любая идея, что происходит?ruby ​​- Вставка нескольких хэшей в массив в ruby ​​

partArray = [] 
partHash = {} 

partHash["name"] = "Item1" 
partHash["owner"] = "Item1" 

#Insert first hash into array 
partArray << partHash 
puts partArray 

#new set of key, value pairs 
#to be appended to array 
partHash["name"] = "Item2" 
partHash["owner"] = "Item2" 

#Append second hash into array 
partArray << partHash 

puts partArray 

выход:

{"name"=>"Item1", "owner"=>"Item1"} 
new Array is : 
{"name"=>"Item2", "owner"=>"Item2"} 
{"name"=>"Item2", "owner"=>"Item2"} 

Я не знаю, почему значения в первом хэша были перезаписаны. Любая помощь приветствуется.

+1

, возможно, это будет пролить некоторый свет: 'р partArray.map (&: object_id)' –

+0

получать тот же хэш object_id с различными значениями. {"name" => "Item1", "owner" => "Item1"} [70094101888900] новый Array is: {"name" => "Item2", "owner" => "Item2"} { "name" => "Item2", "owner" => "Item2"} [70094101888900, 70094101888900] – danynl

ответ

4

Вы сохраняете один и тот же хеш в двух разных местах массива. Подумайте о Ruby, добавив ссылки на объекты вместо копирования объекта каждый раз, когда вы вставляете его в другое.

ли это сделать с различными значениями, вы можете создать новый пароль каждый раз:

part_array = [ ] 
part_array << { 
    # ... Hash entry 
} 

Есть законные причины, почему вы можете поставить то же самое в массиве два раза, это может быть способ экономии памяти при использовании большой структуры данных.

В качестве примечания, Ruby стремится к сильно рекомендует имена переменных, такие как part_array, все в нижнем регистре. Аналогично, для ключей Хэша Символы часто предпочтительнее, так как они недороги внутри.

+0

Вы имеете в виду reiniitialize массив и хэш каждый раз, когда я хочу добавить новую запись? – danynl

+0

Только хэш, так как это то, что вы меняете каждый раз, когда вы его вставляете. Если вы изменили массив, у вас будет массив с только последней записью. – tadman

+0

правильно, я сделал это, и все получилось просто отлично. Спасибо – danynl

1

Я не уверен, почему значения в первом хэше были переписаны?

Сначала мы определяем пустой массив и пустой хеш.

partArray = [] 
partHash = {} 

Теперь мы создаем две новые пары ключ-значение в нашем хеше. Поскольку эти ключи в настоящее время не существуют в пределах partHash, они созданы для вас.

partHash["name"] = "Item1" 
partHash["owner"] = "Item1" 
parthHash #{"name"=>"Item1", "owner"=>"Item1"} 

Вставьте наш хэш в массиве:

partArray << partHash 
partArray #[{"name"=>"Item1", "owner"=>"Item1"}] 

Вот ключевой шаг. Поскольку ключи "name" и "owner" уже существуют внутри хеша, нотация []= просто переопределит любые существующие значения.

partHash["name"] = "Item2" 
partHash["owner"] = "Item2" 
partHash # {"name"=>"Item2", "owner"=>"Item2"} 
partArray #[{"name"=>"Item2", "owner"=>"Item2"}] 

В настоящее время partArray содержит один partsHash хэш. Наконец вы добавляете partHash в partArray снова:

partArray << partHash 
partArray #[{"name"=>"Item2", "owner"=>"Item2"}, {"name"=>"Item2", "owner"=>"Item2"}] 
+0

Да, я понял, что происходит и исправил его, повторно инициализируя хэш, чтобы удалить старые записи. – danynl