【问题标题】:Ruby map method in an array数组中的 Ruby 映射方法
【发布时间】:2014-03-11 14:29:29
【问题描述】:

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

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

【问题讨论】:

    标签: ruby arrays map


    【解决方案1】:

    @a.group_by{|i| i} 正在生成一个哈希,其中 key/value 对是 Array

    现在#map 方法采用每一对。 k 是一个keyv 是一个值,在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 的文档:

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

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2013-06-14
      • 2010-09-05
      • 2020-01-31
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多