Как конвертировать числа в строке в хеш

Учитывая строку, такую ​​как "ABCD 100"Какой самый эффективный способ преобразовать его в {"ABCD": 100}, где "ABCD" это ключ и 100 такое целое число и значение?

3 ответа

Решение

Предполагая, что у вас более одной пары ключ-значение, вы можете объединить split, each_slice а также map:

"ABCD 100 EFG 200".split
                  .each_slice(2)
                  .map {|k, v| [k.to_sym, v.to_i]}.to_h
#=> {:ABCD=>100, :EFG=>200}

Или с scan и группы:

"ABCD 100 EFG 200".scan(/([A-Z]+)\s([0-9]+)/)
                  .map! {|k, v| [k.to_sym, v.to_i]}.to_h
#=> {:ABCD=>100, :EFG=>200}

Используйте регулярные выражения в соответствии с вашей реальной проблемой, это просто пример.

Если это точный формат, я бы сделал

key, value = "ABCD 100".split
{key.to_sym => value.to_i}

Если вы ищете однострочник

Начиная с ruby ​​2.4.0

["ABCD 100".split].to_h.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v.to_i }

От ruby ​​2.4.0

["ABCD 100".split].to_h.transform_values!(&:to_i)

Если ваш шаблон представляет собой строку типа "значение ключа", вы можете использовать String#split. Он принимает строку и возвращает массив подстрок, разделенных разделителем. Если вы не указали разделитель, по умолчанию используется пробел.

def insert_values_from_string_into_hash(to_be_parsed_string, hash)
  string_key, value = to_be_parsed_string.split
  hash[string_key] = value
  hash
end   

insert_values_from_string_into_hash("ABCD 100", {}) 
Другие вопросы по тегам