Превращение хэша в строку пар имя-значение
Если я превращаю хэш ruby в строку пар имя-значение (например, для использования в HTTP-параметрах), это лучший способ?
# Define the hash
fields = {"a" => "foo", "b" => "bar"}
# Turn it into the name-value string
http_params = fields.map{|k,v| "#{k}=#{v}"}.join('&')
Я думаю, мой вопрос:
Есть ли более простой способ добраться до http_params
? Конечно, вышеуказанный способ работает и довольно прост, но мне любопытно, есть ли способ перейти от хеша к строке без предварительного создания массива (результат map
метод)?
4 ответа
Это, вероятно, лучшее, что вы можете сделать. Вы можете перебирать пары в хэше, создавая строку по ходу. Но в этом случае промежуточная строка должна быть создана и удалена на каждом шаге.
У вас есть сценарий использования, где это узкое место производительности? В общем, Ruby делает так много закулисной работы, что беспокоиться о временном массиве, как это, вероятно, не стоит. Если вы обеспокоены тем, что это может быть проблемой, рассмотрите возможность профилирования вашего кода для скорости и использования памяти, часто результаты не соответствуют вашим ожиданиям.
Rails обеспечивает to_query
метод на Hash
учебный класс. Пытаться:
fields.to_query
Из Прагматического Руководства Программиста:
Несколько параметров, передаваемых в yield, преобразуются в массив, если блок имеет только один аргумент.
Например:
> fields = {:a => "foo", :b => "bar"}
> fields.map { |a| a } # => [[:a, "foo"], [:b, "bar"]]
Таким образом, ваш код может быть упрощен следующим образом:
> fields.map{ |a| a.join('=') }.join('&') # => "a=foo&b=bar"
В Rails также был метод преобразования хэша в параметры.
Пример 1: превратить хэш в параметры
{ param1: "value1", param2: "value2" }.to_query
Результат:
"param1=value1¶m2=value2"
Пример 2: превратить параметры в ха
params = "param1=value1¶m2=value2"
Rack::Utils.parse_nested_query(params)
Результат:
{"param1"=>"value1", "param2"=>"value2"}