【问题标题】:what is the mean of * and flatten in rubyruby 中 * 和 flatten 的含义是什么
【发布时间】:2012-06-15 22:33:03
【问题描述】:

我是 ruby​​ 语言的新手,所以当我尝试按值对哈希进行排序时 我用这个方法排序:

movie_popularity.sort_by{|m,p| p}.reverse

但是 sort 方法返回一个数组,而我需要返回一个哈希,所以我使用了这个命令:

movie_popularity=Hash[*movie_popularity.sort_by{|m,p| p}.reverse.flatten]

我的问题是上面一行中*flatten是什么意思?

谢谢 =)

【问题讨论】:

    标签: ruby flatten


    【解决方案1】:

    'flatten' 将数组展平:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-flatten

    '*' 是 splat 运算符:http://theplana.wordpress.com/2007/03/03/ruby-idioms-the-splat-operator/

    最后一个网址中的相关位是这样的:

    a = [[:planes, 21], [:cars, 36]]
    h = Hash[*a]  # => { :planes=>21, :cars=>36}
    

    【讨论】:

      【解决方案2】:

      * 被称为“splat 运算符”;我不确定我能否给你技术定义(虽然我相信你会在谷歌的帮助下很快找到它),但我描述它的方式是它基本上取代了手写多个代码中的逗号分隔值。

      为了更具体,请考虑您在示例中使用的Hash[] 的情况。 Hash 类有一个 [] 类方法,它接受可变数量的参数,通常可以这样调用:

      # Returns { "foo" => 1, "bar" => 2 }
      h = Hash["foo", 1, "bar", 2]
      

      请注意,这不是一个数组、散列或我传入的任何东西;这是一个(手写的)值序列。 * 运算符允许您使用数组来实现基本相同的目标——在您的情况下,是 movie_popularity.sort_by{|m,p| p}.reverse.flatten 返回的那个。

      至于flatten 调用:当您在哈希上调用sort_by 时,您实际上是在利用包含在各种类中的Enumerable 模块(最值得注意的是ArrayHash)提供枚举。在哈希的情况下,您可能已经注意到,不是像这样迭代一个:

      hash.each { |value| ... }
      

      您可以这样做:

      hash.each { |key, value| ... }
      

      也就是说,对哈希进行迭代会在每次迭代中产生 两个 值。因此,您的 sort_by 调用本身将返回 pairs 序列。对此结果调用 flatten 会将这些对折叠为一维值序列,如下所示:

      # Returns [1, 2, 3, 4]
      [[1, 2], [3, 4]].flatten
      

      【讨论】:

        猜你喜欢
        • 2016-11-25
        • 1970-01-01
        • 2018-01-31
        • 1970-01-01
        • 2014-07-02
        • 1970-01-01
        • 1970-01-01
        • 2013-03-26
        • 2018-08-24
        相关资源
        最近更新 更多