Как изменить ha sh формат возврата для Ruby - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующее ха sh:

{"description":"Hello","id":"H"}`

Если я наберу в консоли га sh, я получу:

{:description=>"Hello", :id=>"H"}

Я бы хотел, чтобы вернуть ту же форму, упомянутую первой, используя "description" и "id".

Есть ли способ изменить формат, в котором возвращается мой ха sh?

Ответы [ 3 ]

1 голос
/ 14 апреля 2020
hash = {:description=>"HS - Hours", :id=>"HS"}

hash.stringify_keys
=> {"description"=>"HS - Hours", "id"=>"HS"}
0 голосов
/ 14 апреля 2020

Метод, который используется для обеспечения удобочитаемого представления объекта, равен #inspect. Это также метод, используемый большинством REPL для отображения объектов, хотя некоторые REPL используют другие * REP37-специфичные c методы, такие как #pretty_inspect.

. Очень важно, чтобы все эти методы предназначены только для потребления человеком . Вы не должны анализировать их выходные данные, вы не должны использовать их для сериализации, обработки или чего-либо другого, кроме , просматривая их только в целях отладки .

Итак, зная, что рассматриваемый метод - Hash#inspect, вы можете попробовать переопределить метод. Просто помните, что изменение поведения основных методов никогда не должно выполняться в производственном коде . Это пример для только для этого ответа :

module HashPrettyPrintExtension
  def inspect
    '{ ' <<
      map do |k, v|
        k = k.to_s if k.is_a?(Symbol)
        %Q[#{k.inspect}: #{v.inspect}]
      end.join(', ') <<
        ' }'
  end
end

module HashPrettyPrintRefinement
  refine Hash do
    prepend HashPrettyPrintExtension
  end
end

{ "description": "Hello", "id": "H" }
#=> { :description => "Hello", :id => "H" }

using HashPrettyPrintRefinement

{ "description": "Hello", "id": "H" }
#=> { "description": "Hello", "id": "H" }

Обратите внимание, что предлагаемый вывод несколько ограничен. Это действительно хорошо работает только для ключей, которые Symbol с и значения, которые String с, тогда как в Ruby ключи могут быть любой произвольный объект , а значения могут быть любой произвольный объект .

Кроме того, ваш предложенный вывод в точности противоречит цели #inspect, а именно - обеспечить читабельный вывод отладочной информации, потому что не легко увидеть, что ключ не является строкой.

0 голосов
/ 14 апреля 2020

У вас есть Ха sh с Символом клавиши:

h = {"description": "Hello", "id": "H"}

Учитывайте это :

({"description": "Hello", "id": "H"}) == ({"description"=> "Hello", "id"=> "H"})
#=> false

({"description": "Hello", "id": "H"}) == ({description: "Hello", id: "H"})
#=> true

Ruby просто удаляет " при печати:

p ({"description":"Hello","id":"H"})
#=> {:description=>"Hello", :id=>"H"}

Если вы хотите преобразовать ключи в String , вы можете использовать чистые Ruby Hash # transform_keys (или версия взрыва transform_keys!):

h.transform_keys &:to_s
#=> {"description"=>"Hello", "id"=>"H"}

Если json - это то, что вы ищете, выполните:

require 'json'

puts h.to_json
#=> {"description":"Hello","id":"H"}

Учтите также, что:

h.to_json.class #=> String
h.class #=> Hash

...