Ruby中的Splat操作符(快速举例)

时间:2013-06-27 10:45:03

标签: ruby

您好我正在研究一些Ruby代码。在Ruby中实现Quicksort:

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功能。很抱歉,如果这是一个重复的问题,因为我不知道搜索此问题的关键字。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

  

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

来自4 Lines of Code

答案 2 :(得分: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