有人可以帮我理解地图功能在这段代码中的作用吗?
counts = @a.group_by{|i| i}.map{|k,v| [k[0], k[1], v.count]}
答案 0 :(得分:4)
@a.group_by{|i| i}
正在生成哈希,其中键/值对为Array
。
现在#map
方法接受每对。 k
是key
,而v
是map
内的值,创建数组[first_entry_of_array,second_entry_of_array,value_array_size]
(当键/值都是数组时)。我说key
可以是一个数组,因为您使用了k[0]
,k[1]
,Array#[]
就是实际的方法。
示例:
a = [ %w(foo bar) ,%W(baz bar), %w(foo bar) ]
a.group_by { |e| e }
# => {["foo", "bar"]=>[["foo", "bar"], ["foo", "bar"]],
# ["baz", "bar"]=>[["baz", "bar"]]}
a.group_by { |e| e }.map{|k,v| [k[0], k[1], v.count]}
# => [["foo", "bar", 2], ["baz", "bar", 1]]
key
也可以是字符串。然后它位于#map
内[first_character_of_string,second_character_of_string,value_array_size]
。与此相同的原因,我怀疑key
可以是一个字符串,因为那些调用是String#[]
方法调用。
示例:
a = %w(foo bar foo baz bar)
a.group_by { |e| e }
# => {"foo"=>["foo", "foo"], "bar"=>["bar", "bar"], "baz"=>["baz"]}
# ^ ^
# key value
a.group_by { |e| e }.map{|k,v| [k[0], k[1], v.count]}
# => [["f", "o", 2], ["b", "a", 2], ["b", "a", 1]]
基本上#map
会产生一个数组的数组。
直接来自map
的文档:
为枚举中的每个元素返回一个新的数组,其中包含运行块的结果。
在您的示例中,包含运行块的结果,表示结果在每次迭代后生成,来自#map
的块,为[k[0], k[1], v.count]
。
直接来自group_by
的文档:
按块的结果对集合进行分组。 返回一个哈希,其中键是来自块的评估结果,值是集合中与键对应的元素数组。
希望有所帮助!