2012-06-01 71 views
8

我試圖在不使用reverse方法的情況下反轉Enumerable(如Array),但使用reverse_each迭代器。Ruby中的可逆枚舉

我希望,那下面的代碼就足夠了:

p [1,2,3].reverse_each {|v| v } 

然而塊不返回逆轉orded陣列。當然我可以寫

[1,2,3].reverse_each {|v| p v } 

但我想以第一種方式收集物品。如果這種行爲是什麼來源,我應該如何寫出我的表達來滿足要求?

回答

19

從1.8.7,Enumerable#each_*方法return an enumerator當沒有塊提供。這很不錯:現在許多原本勢在必行的方法可以用作功能表達式。

所以,如果你想收集的物品,對枚舉使用Enumerable#map

reversed_values = [1, 2, 3].reverse_each.map { |x| 2*x } 
#=> [6, 4, 2] 
+0

的'reverse_each'超級方便!謝謝! –

-1

另一種方法是[1, 2, 3].reverse_each.to_a

+0

你打電話給陣列上的to_a ... – askl56

+0

糟糕,按照我的意思編輯它 – Dorian

-1

(1..3).reverse_each {| V | PV}

生產:

它建立一個臨時數組並穿過以相反的順序數組,但不返回變換集合的反向複製

如果沒有塊被給出,而是返回一個枚舉器。

但是紅寶石的地圖方法

返回與在枚舉每一次元件運行塊的結果的新的數組。

p [1,2,3] .reverse_each.map {| v | V}

reverse_each - 將作爲一個迭代

地圖 - 將形成一套新的集合