Превращение хэша в строку пар имя-значение

Если я превращаю хэш 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&param2=value2"

Пример 2: превратить параметры в ха

params = "param1=value1&param2=value2"

Rack::Utils.parse_nested_query(params)

Результат:

{"param1"=>"value1", "param2"=>"value2"}

Другие вопросы по тегам