将哈希变为一串名称 - 值对

时间:2009-12-01 03:10:59

标签: ruby string hash name-value

如果我将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 个答案:

答案 0 :(得分:10)

Rails在to_query类上提供Hash方法。尝试:

fields.to_query

答案 1 :(得分:8)

来自实用程序员指南

  

传递给yield的多个参数   如果块,则转换为数组   只有一个论点。

例如:

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

所以你的代码可以这样简化:

> fields.map{ |a| a.join('=') }.join('&') # => "a=foo&b=bar"

答案 2 :(得分:5)

这可能是你能做的最好的事情。您可以迭代哈希中的对,随时构建字符串。但在这种情况下,需要在每一步创建和删除中间字符串。

你有一个用例,这是一个性能瓶颈吗?一般来说,Ruby在幕后做了很多工作,担心像这样的临时数组可能不值得。如果您担心这可能是一个问题,请考虑分析代码的速度和内存使用情况,结果往往不是您所期望的。

答案 3 :(得分:0)

在Rails中,它还有一种将哈希转换为参数的方法。

示例1:将哈希值转换为参数

{ param1: "value1", param2: "value2" }.to_query

结果:

"param1=value1&param2=value2"

示例2:将参数转换为hahs

params = "param1=value1&param2=value2"

Rack::Utils.parse_nested_query(params)

结果:

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