У меня есть эта строка, и мне интересно, как ее преобразовать в хэш.
"{:account_id=>4444, :deposit_id=>3333}"
У меня есть эта строка, и мне интересно, как ее преобразовать в хэш.
"{:account_id=>4444, :deposit_id=>3333}"
Угадай, я никогда не писал об этом обходной путь... Вот оно,
# strip the hash down
stringy_hash = "account_id=>4444, deposit_id=>3333"
# turn string into hash
Hash[stringy_hash.split(",").collect{|x| x.strip.split("=>")}]
Способ, предложенный в ответе miku, действительно проще всего и unsafest.
# DO NOT RUN IT
eval '{:surprise => "#{system \"rm -rf / \"}"}'
# SERIOUSLY, DON'T
Рассмотрим использование другого строкового представления ваших хешей, например. JSON или YAML. Это более безопасно и по крайней мере одинаково устойчиво.
С небольшой заменой вы можете использовать YAML:
require 'yaml'
p YAML.load(
"{:account_id=>4444, :deposit_id=>3333}".gsub(/=>/, ': ')
)
Но это работает только для этой конкретной простой строки. В зависимости от ваших реальных данных могут возникнуть проблемы.
Самый простой и unsafest - это просто оценить строку:
>> s = "{:account_id=>4444, :deposit_id=>3333}"
>> h = eval(s)
=> {:account_id=>4444, :deposit_id=>3333}
>> h.class
=> Hash
если ваш хеш строки является чем-то вроде этого (он может быть вложенным или простым хэшем)
stringify_hash = "{'account_id'=>4444, 'deposit_id'=>3333, 'nested_key'=>{'key1' => val1, 'key2' => val2}}"
вы можете преобразовать его в хэш как это, не используя eval, который опасен
desired_hash = JSON.parse(stringify_hash.gsub("'",'"').gsub('=>',':'))
и для той, которую вы опубликовали, где ключ является символом, который вы можете использовать следующим образом
JSON.parse(string_hash.gsub(':','"').gsub('=>','":'))