2013-03-06 61 views
1

是否有類似於Haskell循環的Ruby方法? Haskell的循環獲取一個列表並返回該列表無限地附加到自身。它通常用於從數組頂部捕獲一定數量的元素的take。有沒有一個Ruby方法接受一個數組並返回n次附加數組?Ruby類似於Haskells循環的方法

+0

僅供參考,週期由下式給出:'週期XS = XS',其中的xs' = XS ++ xs''這就是美 – 2013-03-06 20:10:26

回答

3

可以使用Array#*乘以一個整數數組:

元* INT→new_ary

[...]否則,返回由建一個新的數組連接selfint拷貝。

所以你可以做這樣的事情:

>> [1, 2] * 3 
=> [1, 2, 1, 2, 1, 2] 
+1

+1,個人而言,我通常會這樣做。 'cycle'可能是「懶惰」,或者至少不會產生像'*'這樣的中間數組。 – 2013-03-06 07:07:11

+1

@theTinMan:由於'a.cycle'和'a.cycle(n)'都是'Enumerator',我懷疑'cycle'是懶惰的。如果我知道我需要多少,我會用'*',如果我不知道,我會用'循環'。 – 2013-03-06 07:11:10

8

是的,它被稱爲cycle。從文檔:

 
Array.cycle 

(from ruby core) 
------------------------------------------------------------------------------ 
    ary.cycle(n=nil) {|obj| block } -> nil 
    ary.cycle(n=nil)     -> an_enumerator 


------------------------------------------------------------------------------ 

Calls block for each element repeatedly n times or forever if none 
or nil is given. If a non-positive number is given or the array is empty, does 
nothing. Returns nil if the loop has finished without getting interrupted. 

If no block is given, an enumerator is returned instead. 

    a = ["a", "b", "c"] 
    a.cycle {|x| puts x } # print, a, b, c, a, b, c,.. forever. 
    a.cycle(2) {|x| puts x } # print, a, b, c, a, b, c. 

編輯:

好像什麼塊內基本上是「拉姆達」,而且據我所知,我不能讓一個lambda將每個元素連接到現有陣列上。

b = [1, 2, 3] 
z = [] 
b.cycle(2) { |i| z << i } 
z # => [1, 2, 3, 1, 2, 3] 
+1

搞怪當你閱讀精細手冊時會發生什麼,呃? – 2013-03-06 07:04:20

+3

不可思議的事情發生;神祕的方法似乎從來沒有出現過。 :-) – 2013-03-06 07:05:29

+0

我閱讀手冊。這看起來不像Haskell的循環所做的那樣。我對Ruby有點新鮮,所以我真的不知道如何讓循環做我想做的事。看起來塊內部的內容基本上是一個「Lambda」,據我所知,我不能將每個元素的lambda連接到現有的數組上。 – 2013-03-06 07:10:42