В Ruby хэши являются структурой данных ключевого значения. Ключи могут фактически быть смесью любых типов объектов:
hash_with_numerical_keys = {
1 => 'A',
2 => 'B',
3 => 'C'
3.5 => 'D'
}
hash_with_string_keys = {
'a' => 1,
'b' => 2,
'c' => 3
}
hash_with_symbols = {
:a => 1,
:b => 2,
:c => 3
}
# can also be declared as
hash_with_symbols = {
a: 1,
b: 2,
c: 3
}
hash_with_singletons = {
nil => 0,
true => 1,
false => 2
}
Символы обычно используются, поскольку существует только один экземпляр символа. Таким образом, они действительно эффективны для сравнения. Строковые клавиши в основном вступают в игру, когда вы имеете дело с JSON или с какими-либо внешними данными.
Ха sh, на который вы смотрите, содержит комбинацию строковых и символьных клавиш:
{:data=>{"name"=>"david"}, :metadata=>{"body_size"=>"16", "collector_ip"=>"172.22.0.1", "collector_timestamp"=>1579610268940, "event"=>"default", "version"=>"1.0.0"}}
В Ruby 2.5 вы можете использовать hash # transform_keys для преобразования ключей в строки:
hash.transform_keys(&:to_s)
В более ранних версиях вы можете сделать:
hash.each_with_object({}) do |(k,v), new_hash|
new_hash[k.to_s] = v
end
Если вы вы используете Rails или просто ActiveSupport, который вы можете использовать Hash#stringify_keys
, Hash#deep_stringify_keys
или HashWithIndifferentAccess