【问题标题】:Splat operator in Ruby (a quicksort example)Ruby 中的 Splat 运算符(快速排序示例)
【发布时间】:2013-06-27 10:45:03
【问题描述】:

您好,我正在研究一些 Ruby 代码。在 Ruby 中实现快速排序:

1 def qsort(lst)
2   return [] if lst.empty?
3   x, *xs = *lst
4   less, more = xs.partition{|y| y < x}
5   qsort(less) + [x] + qsort(more)
6 end

给定:

lst = [1, 2, 3, 4, 5]

x, *xs = *lst

我不知道我是否理解第 3 行的操作正确:

根据我的观察和实验,这会将1lst 分配给x,并将lst 的其余部分分配给xs

我还发现这两个在做同样的事情:

x, *xs = *lst

  相当于

x, *xs = lst

我的问题是,这个不错的功能的名称是什么(我会在之后编辑标题以适应)?然后我可以自己研究更多关于这个 Ruby 特性的信息。对不起,如果这是一个重复的问题,因为我不知道搜索这个问题的关键字。

【问题讨论】:

  • qsort 函数是一些漂亮的 ruby​​ 代码。 x, *xs = lst 等价于x, *xs = *lst 的原因是因为x, y = [1, 2] 等价于x, y = 1, 2,实际上是x, y = *[1, 2]。显然,在第一种情况下,当您在右侧站点上有一个数组并且在您分配给的左侧站点上有多个变量时,会出现隐式 splat。

标签: ruby


【解决方案1】:

此功能的名称在 Ruby 中称为 splat 运算符。

【讨论】:

    【解决方案2】:

    Ruby、Groovy 和 Perl 中的 splat 运算符允许您在参数和数组之间切换:它将列表拆分为一系列参数,或者收集一系列参数来填充数组。

    来自4 Lines of Code

    【讨论】:

      【解决方案3】:

      此声明

      x, *xs = *lst
      

      对我来说没有多大意义,但这些可以:

      x, *xs = [1, 2, 3] # x -> 1, xs -> [2, 3]
      x = 1, *[2, 3, 4] # x -> [1, 2, 3, 4]
      

      这种用法 IMO 与参数无关,但正如其他人所说,splat 可以(并且通常是)与参数一起使用:

      def foo(a, b, c)
      end
      
      foo(*[1,2,3]) # a -> 1, b -> 2, c -> 3
      

      【讨论】:

        猜你喜欢
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        相关资源
        最近更新 更多