【问题标题】:What does the "*" mean in this recursive ruby function? [duplicate]这个递归红宝石函数中的“*”是什么意思? [复制]
【发布时间】:2016-05-07 09:45:09
【问题描述】:

我读到这段代码是关于 quicksort 的代码,并为 Array 类进行了猴子补丁。

class Array
  def quicksort
    return [] if empty?

    pivot = delete_at(rand(size))
    left, right = partition(&pivot.method(:>))

    return *left.quicksort, pivot, *right.quicksort
  end
end

我不知道*left.quicksort 开头的星号 (*) 是什么。我们不能只使用left.quicksort吗?

【问题讨论】:

  • 如果一个问题是重复的,并且您真的想获得一些关于它的原始反馈,您应该前往 ruby​​ IRC 频道之一并在那里提问。您甚至不必拥有 IRC 客户端,这里有基于 Web 的访问,例如:irc.lc/freenode/ruby-lang。那或红宝石子版块

标签: ruby


【解决方案1】:

星号(在本例中)代表数组解包。其背后的想法是,您希望获得一个具有给定元素的数组,而不是 array, element, arrayarray

left  = [1, 2, 3]
pivot = 4
right = [5, 6, 7]

[left, pivot, right] # => [[1, 2, 3], 4, [5, 6, 7]]

[*left, pivot, *right] # => [1, 2, 3, 4, 5, 6, 7]

【讨论】:

    【解决方案2】:

    * 接受参数列表并将它们拆分为单独的元素。 这允许您返回一个未嵌套的数组,即使左右本身返回一个数组。

    关于我们不能只使用left.quicksort,你试过了吗?

    def a()
      return *[1,2,3], 4, *[5,6]
    end
    
    def b()
     return [1,2,3], 4, *[5,6]
    end
    
    b()
    => [[1, 2, 3], 4, 5, 6]
    a()
    => [1, 2, 3, 4, 5, 6]
    

    【讨论】:

      【解决方案3】:

      没有星号,您将返回三个值...第一个和最后一个值将是具有多个值的单个数组

      [array1], pivot, [array2]
      

      使用星号,数组值将作为单独的组件返回...

      array1_value_1, array1_value_2, array1_value_3, ..., pivot, array2_value_1, array2_value2, array2_value_3, ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        • 2022-11-01
        • 2010-10-06
        • 2012-08-27
        • 2014-10-22
        相关资源
        最近更新 更多