数组中的Ruby映射方法

时间:2014-02-12 23:10:13

标签: ruby arrays map

有人可以帮我理解地图功能在这段代码中的作用吗?

counts = @a.group_by{|i| i}.map{|k,v| [k[0], k[1], v.count]}

1 个答案:

答案 0 :(得分:4)

@a.group_by{|i| i}正在生成哈希,其中键/值对为Array

现在#map方法接受每对。 kkey,而vmap内的值,创建数组[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的文档:

  

按块的结果对集合进行分组。 返回一个哈希,其中键是来自块的评估结果值是集合中与键对应的元素数组

希望有所帮助!