Превращение хэша в строку пар имя-значение - PullRequest
9 голосов
/ 01 декабря 2009

Если я превращаю хэш 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)?

Ответы [ 3 ]

10 голосов
/ 27 ноября 2012

Rails предоставляет метод to_query в классе Hash. Попробуйте:

fields.to_query

8 голосов
/ 01 декабря 2009

Из Руководства программиста Pragmatic :

Несколько параметров, передаваемых в выход, преобразуются в массив, если блок имеет только один аргумент.

Например:

> fields = {:a => "foo", :b => "bar"}
> fields.map  { |a| a } # => [[:a, "foo"], [:b, "bar"]]

Таким образом, ваш код можно упростить так:

> fields.map{ |a| a.join('=') }.join('&') # => "a=foo&b=bar"
5 голосов
/ 01 декабря 2009

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

Есть ли у вас сценарий использования, когда это узкое место в производительности? В общем, Ruby делает так много закулисной работы, что беспокоиться о временном массиве, как это, вероятно, не стоит. Если вы обеспокоены тем, что это может быть проблемой, рассмотрите возможность профилирования вашего кода по скорости и использованию памяти, часто результаты не соответствуют вашим ожиданиям.

...