9

如果我将 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

4 回答 4

10

Rails 提供to_query了类的方法Hash。尝试:

fields.to_query

于 2012-11-27T08:42:32.100 回答
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"
于 2009-12-01T06:14:02.700 回答
5

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

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

于 2009-12-01T04:25:15.213 回答
0

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

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

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

结果:

"param1=value1&param2=value2"

示例 2:将 params 转换为 hahs

params = "param1=value1&param2=value2"

Rack::Utils.parse_nested_query(params)

结果:

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

于 2020-12-16T15:01:15.850 回答