【发布时间】:2014-03-11 14:29:29
【问题描述】:
有人可以帮我理解这段代码中地图函数的作用吗?
counts = @a.group_by{|i| i}.map{|k,v| [k[0], k[1], v.count]}
【问题讨论】:
有人可以帮我理解这段代码中地图函数的作用吗?
counts = @a.group_by{|i| i}.map{|k,v| [k[0], k[1], v.count]}
【问题讨论】:
@a.group_by{|i| i} 正在生成一个哈希,其中 key/value 对是 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 的文档:
按块的结果对集合进行分组。 返回一个散列,其中键是块的评估结果,值是集合中与键对应的元素数组。
希望有帮助!
【讨论】: