我是Ruby的新手,我正在尝试理解我遇到的地图方法示例:
{:a => "foo", :b => "bar"}.map{|a, b| "#{a}=#{b}"}.join('&')
返回:
=> "a=foo&b=bar"
我不明白
b=bar
返回。字符串插值令我感到困惑,因为它似乎会返回类似:
=> "a=foo&bbar"
答案 0 :(得分:7)
> {:a => "foo", :b => "bar"}.map{|key, value| "#{key}=#{value}"}
#=> ["a=foo", "b=bar"]
map
方法会将哈希的每个元素取为key
和value
对
"#{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,v
或key,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并创建一些哈希和数组并使用它们。我强烈建议您使用唯一的名称来解释发生了什么。 我希望这可以帮助你。