Ruby: какая разница, используя свойство с двоеточиями и кавычками - PullRequest
0 голосов
/ 21 января 2020

Я новичок ie на Ruby, просто делаю быстрое обновление в существующем проекте, и мне интересно, в чем разница между объектом record и to_validate.

puts to_validated.class
# Hash
puts to_validated
# {"data"=>{"name"=>"david"}, "metadata"=>{"body_size"=>"16", "collector_ip"=>"172.22.0.1", "collector_timestamp"=>1579608324863, "event"=>"whatever", "version"=>"1.0"}}


puts record.class
# Hash
puts record
# {:data=>{"name"=>"david"}, :metadata=>{"body_size"=>"16", "collector_ip"=>"172.22.0.1", "collector_timestamp"=>1579610268940, "event"=>"default", "version"=>"1.0.0"}}

Единственная разница на этих объектах - это двоеточия на data и metadata. Можно ли конвертировать двоеточия в кавычки?

Я знаю, что это глупый вопрос, но я применяю исправление в этом проекте и использую стороннюю библиотеку, которая не может использовать record объект.

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Вы можете использовать Hash.transform_keys, который был введен в Ruby в версии 2.5, чтобы преобразовать символизированные ключи в строки:

record.transform_keys { |k| k.to_s }
1 голос
/ 21 января 2020

В 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...