Как преобразовать рубиновый хеш в строку с определенным форматом - PullRequest
1 голос
/ 25 сентября 2019

Это хэш, который я пытаюсь отформатировать

input = {"test_key"=>"test_value", "test_key2"=>"test_value2"}

И это ожидаемый результат

"{\n\t\"test_key\" = \"test_value\";\n\t\"test_key2\" = \"test_value2\";\n}"

У меня пока есть следующий код

def format_hash(hash)
  output = ""
  hash.to_s.split(',').each do |k|
    new_string = k + ';'
    new_string.gsub!('=>', ' = ')
    output += new_string
  end
end

, который дает мне этот вывод

output = "{\"test_key\" = \"test_value\"; \"test_key2\" = \"test_value2\"};"

Но я все еще борюсь с добавлением остальных.Есть идеи / предложения?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019
input = {"test_key"=>"test_value", "test_key2"=>"test_value2"}

"{" << input.map { |k,v| "\n\t\"#{k}\" = \"#{v}\"" }.join(';') << ";\n}"
  #=> "{\n\t\"test_key\" = \"test_value\";\n\t\"test_key2\" = \"test_value2\";\n}"

Шаги следующие.

a = input.map { |k,v| "\n\t\"#{k}\" = \"#{v}\"" }
  #=> ["\n\t\"test_key\" = \"test_value\"", "\n\t\"test_key2\" = \"test_value2\""] 
b = a.join(';')
  #=> "\n\t\"test_key\" = \"test_value\";\n\t\"test_key2\" = \"test_value2\""
"{" << b << ";\n}"
  #=> "{\n\t\"test_key\" = \"test_value\";\n\t\"test_key2\" = \"test_value2\";\n}" 

input может содержать любое количество пар ключ-значение, которые придерживаютсяпо указанному шаблону.

1 голос
/ 25 сентября 2019

Одной из отправных точек может быть использование JSON formatter:

require 'json'
input = {"test_key"=>"test_value", "test_key2"=>"test_value2"}
JSON.pretty_generate(input)

=> "{\n  \"test_key\": \"test_value\",\n  \"test_key2\": \"test_value2\"\n}"

В этом есть некоторые тонкие различия, поскольку похоже, что вы используете = вместо :.Тем не менее, возможно, из этого легче работать, чем из того, что у вас есть.

Работа с JSON

JSON.pretty_generate(input).gsub(/:/,' =').gsub(/,(?=\n)/, ';').gsub(/(;\n|\n)\s+/, '\1'+"\t")

=> "{\n\t\"test_key\" = \"test_value\";\n\t\"test_key2\" = \"test_value2\"\n}"

Пользовательский форматер

Конечно, вы можете определить свой собственный форматер:

def formatter(hash)
  output = ""
  output += "{\n\t" 
  output += hash.entries.map{|a| "\"#{a[0]}\" = \"#{a[1]}\"" }.join(";\n\t")
  output += ";\n}"
end

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