如果我将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
方法的结果)?
答案 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¶m2=value2"
示例2:将参数转换为hahs
params = "param1=value1¶m2=value2"
Rack::Utils.parse_nested_query(params)
结果:
{"param1"=>"value1", "param2"=>"value2"}