2013-06-27 29 views
3

您好,我正在學習一些Ruby代碼。在Ruby中實現快速排序:Ruby中的Splat運算符(快速排序示例)

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做正確:

從我的觀察和實驗,這將指派1lstx,以及其餘的lstxs

而且我發現這兩個都在做同一件事:

​​

   相當於

x, *xs = lst 

我的問題是,這是什麼不錯的功能的名稱(我將編輯標題事後適應)?然後我可以自己學習更多關於這個Ruby特性的知識。對不起,如果這是一個重複的問題,因爲我不知道關鍵字來搜索這個問題。

+0

qsort函數是一些漂亮的ruby代碼。爲什麼'x,* xs = lst'等於'x,* xs = * lst'的原因是因爲x,y = [1,2]等於x,y = 1,2,是'x,y = * [1,2]'。顯然,在第一種情況下,如果在正確的站點上有一個數組,並且在您要分配的左側站點上有多個變量,則會出現隱式的圖示。 – Linki

回答

6

此功能的名稱在Ruby中稱爲splat運算符。

2

Ruby,Groovy和Perl中的splat運算符允許您在參數和數組之間切換:它在一系列參數中拆分列表,或者收集一系列參數以填充數組。

4 Lines of Code

1

本聲明

​​

沒有多大意義,我,但這些事:

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

這種用法IMO無關帶參數,但也有人說圖示可(通常是)與參數一起使用:

def foo(a, b, c) 
end 

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