【问题标题】:Turning a hash into a string of name-value pairs将散列转换为名称-值对字符串
【发布时间】:2010-12-21 21:06:14
【问题描述】:

如果我将 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 方法的结果)?

【问题讨论】:

  • 你的和我的一样。不要忘记对值进行适当的编码。

标签: ruby string hash name-value


【解决方案1】:

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

fields.to_query

【讨论】:

  • 不错!这正是我想要的。
【解决方案2】:

来自实用程序员指南

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

例如:

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

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

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

【讨论】:

  • 我看不出这有多简单。如果有的话,它隐藏了“多参数 => 数组”魔法背后的代码意图。
  • 嗯,这当然是一个品味问题。 发现它更简单,因为它无需我显式处理键和值即可构造字符串。不过,我同意它的可读性较差。
【解决方案3】:

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

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

【讨论】:

  • 不,我不担心这是一个性能问题——我只是对 ruby​​ 还比较陌生,很想知道是否有一种“更简单”的方法。似乎每次我开始编写一个方法时,我都会找到一个 ruby​​ 或 rails 方法来做完全相同的事情(例如distance_of_time_in_words)。 :)
【解决方案4】:

在 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"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多