3

您好,我正在研究一些 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 行的操作正确:

根据我的观察和实验,这将分配1fromlstx,其余的lstto xs

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

x, *xs = *lst

   相当于

x, *xs = lst

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

4

3 回答 3

6

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

于 2013-06-27T10:49:01.020 回答
2

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

来自4 行代码

于 2013-06-27T11:49:08.533 回答
1

这个说法

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-06-27T14:27:11.623 回答