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

jer*_*ith 9 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('&')
Run Code Online (Sandbox Code Playgroud)

我想我的问题是:

有更简单的方法http_params吗?当然,上面的方法是有效的,并且相当简单,但我很好奇是否有办法从哈希到字符串而不先创建一个数组(map方法的结果)?

小智 10

Rails提供to_queryHash类的方法.尝试:

fields.to_query


小智 8

来自The Pragmatic Programmer's Guide:

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

例如:

> fields = {:a => "foo", :b => "bar"}
> fields.map  { |a| a } # => [[:a, "foo"], [:b, "bar"]]
Run Code Online (Sandbox Code Playgroud)

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

> fields.map{ |a| a.join('=') }.join('&') # => "a=foo&b=bar"
Run Code Online (Sandbox Code Playgroud)


mom*_*ara 5

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

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