У меня есть следующий сценарий на Ruby:Толчок Hash на массив: последний Hash перезаписи предыдущих элементов массива
arr = ['bob', 'jack', 'smith']
array_of_hashes = Array.new
hash = Hash.new
arr.each do |item|
hash.clear
hash[:name] = item
array_of_hashes << hash
end
puts array_of_hashes
Это возвращает массив хэш, чей: ключи имени все от последнего элемента.
[
[0] {
:name => "smith"
},
[1] {
:name => "smith"
},
[2] {
:name => "smith"
}
]
Я бы ожидать, что она возвращает следующее, но я застрял, пытаясь выяснить, почему элемент последний Хэш перезаписывать все предыдущие элементы массива:
[
[0] {
:name => "bob"
},
[1] {
:name => "jack"
},
[2] {
:name => "smith"
}
]
EDIT: Спасибо всем за ваши ответы. Приятно иметь несколько разных методов, выполненных для достижения того же. Я тестировал каждое решение, и каждый из них великолепный. Я закончил тем, что был наиболее похож на мой оригинальный код; но мой вариант использования - простой, локальный скрипт - он не используется в промышленном приложении - в этом случае я бы выбрал другое решение.
Спасибо за ваш пост Ed; Мне очень нравится, как этот код наглядно иллюстрирует недостаток в моем исходном коде - то есть, у меня только один хэш, с которым я имел дело, и этот код создает новый хэш для каждого элемента массива. – singularity
Я рад, что это помогло, @singularity. Спасибо за поддержку. –
Я принял этот ответ сейчас, потому что это то, что я закончил делать. Это был самый быстрый путь от моего исходного кода к рабочему скрипту. По сути, 'Hash.new' должен был находиться в блоке' arr.each'. '.clear' тоже не нужен. Хотя это может быть не самое элегантное решение, это наиболее практично для моего сценария и выполняет свою работу. – singularity