理解Ruby中的地图

时间:2017-02-01 04:38:53

标签: ruby dictionary methods

我是Ruby的新手,我正在尝试理解我遇到的地图方法示例:

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

返回:

=> "a=foo&b=bar"

我不明白

b=bar

返回。字符串插值令我感到困惑,因为它似乎会返回类似:

=> "a=foo&bbar"

3 个答案:

答案 0 :(得分:7)

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

map方法会将哈希的每个元素取为keyvalue

"#{key}=#{value}"字符串插值,可在=key之间添加value

  

在开头#{和结束}位之间使用此语法   被评估为Ruby代码,此评估的结果将是   嵌入到它周围的字符串中。

Array#join 将返回通过将数组的每个元素转换为字符串而创建的字符串,该字符串由给定的分隔符分隔。

所以在你的情况下:

> ["a=foo", "b=bar"].join('&')
#=> "a=foo&b=bar" 

Rails 中,您可以使用 Hash#to_query 方法将哈希转换为查询参数,这将返回相同的结果。

 > {:a => "foo", :b => "bar"}.to_query
 #=> "a=foo&b=bar"

答案 1 :(得分:3)

符号键:a和局部变量a没有任何共同之处。名字只是巧合地相同。请考虑使用此代码:

{
  var1: "value1",
  var2: "value2"
}.map do |key, value|
  "#{key}=#{value}"
end.join('&')
# => "var1=value1&var2=value2"

这里的变量不同。 map的作用与each一样,会迭代哈希中的每个键值对。这意味着你也可以做这样的事情来简化:

{
  var1: "value1",
  var2: "value2"
}.map do |pair|
  pair.join('=')
end.join('&')
# => "var1=value1&var2=value2"

通常在对Hash进行迭代时,您应该使用k,vkey,value之类的名称来清楚您正在操作的内容。

如果您对迭代循环中内部发生的事情感到困惑,可以这样调试:

{
  var1: "value1",
  var2: "value2"
}.map do |pair|
  puts pair.inspect
  pair.join('=')
end.join('&')

这为你提供了这个输出:

[:var1, "value1"]
[:var2, "value2"]

这项技术有很多帮助。甚至还有这方面的简写符号:

p pair

答案 2 :(得分:1)

此处发生了2次方法调用,即地图和连接。使其更清晰和更容易理解的一种方法是分离这两种方法并改变map方法中使用的关键字。而不是

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

让我们

{:a => "foo", :b => "bar"}.map{|key, value| "#{key}=#{value}"}

这将返回一个数组。 #=> ["a=foo", "b=bar"]

现在:

["a=foo", "b=bar"].join('&')

产生刺痛 #=> "a=foo&b=bar"

Map迭代两个键/值对,并使用' ='创建一个字符串。它们之间并以数组形式返回。它将遍历严酷的所有键/值对。我们的例子只有2。

将数组的两个元素与'&'连接在一起。它们之间的符号并将其作为字符串返回。无论大小如何,它都会附加数组的所有元素。

帮助我学习地图和连接的是打开irb或pry并创建一些哈希和数组并使用它们。我强烈建议您使用唯一的名称来解释发生了什么。 我希望这可以帮助你。