Является ли сохранение хэша в другой хэш обычной практикой? - PullRequest
2 голосов
/ 15 июня 2009

Я бы хотел сохранить некоторые хеш-объекты в коллекцию (в мире Java это выглядит как список). Я ищу в Интернете, чтобы увидеть, есть ли подобная структура данных в Ruby, и не нашел ни одной. В настоящее время я пытаюсь сохранить хэш a[] в хэш b[], но у меня возникают проблемы при попытке извлечь данные из хеша b[].

Существуют ли какие-либо встроенные структуры сбора данных в Ruby? Если нет, то является ли сохранение хеша обычной практикой хеширования?

Ответы [ 5 ]

3 голосов
/ 15 июня 2009

Если проблема связана с хэшем в хэше, попробуйте:

>> p = {:name => "Jonas", :pos => {:x=>100.23, :y=>40.04}}
=> {:pos=>{:y=>40.04, :x=>100.23}, :name=>"Jonas"}
>> p[:pos][:x]
=> 100.23
2 голосов
/ 15 июня 2009

Вопрос не совсем понятен, но я думаю, вы хотите иметь список (массив) хэшей, верно?

В этом случае вы можете просто поместить их в один массив, который похож на список в Java:

a = {:a => 1, :b => 2}
b = {:c => 3, :d => 4}
list = [a, b]

Вы можете получить такие хэши, как list [0] и list [1]

2 голосов
/ 15 июня 2009

С этим не должно быть никаких проблем.

a = {:color => 'red', :thickness => 'not very'}
b = {:data => a, :reason => 'NA'}

Возможно, вы могли бы объяснить, с какими проблемами вы сталкиваетесь.

1 голос
/ 16 июня 2009

Все ответы здесь до сих пор касаются Hash in Hash, а не Hash plus Hash, поэтому для полноты изложения приведу следующее:

# Define two independent Hash objects
hash_a = { :a => 'apple', :b => 'bear', :c => 'camel' }
hash_b = { :c => 'car', :d => 'dolphin' }

# Combine two hashes with the Hash#merge method
hash_c = hash_a.merge(hash_b)

# The combined hash has all the keys from both sets
puts hash_c[:a] # => 'apple'
puts hash_c[:c] # => 'car', not 'camel' since B overwrites A

Обратите внимание, что при объединении B с A все ключи, которые были у A и находятся в B., перезаписываются.

1 голос
/ 15 июня 2009

Списки в Ruby являются массивами. Вы можете использовать Hash.to_a .

Если вы пытаетесь объединить хеш a с хешем b, вы можете использовать Hash.merge

РЕДАКТИРОВАТЬ: Если вы пытаетесь вставить хеш a в хэш b, вы можете сделать

b["Hash a"] = a;
...