2012-06-01 15 views
8

में गणित को उलट करने के लिए मैं reverse विधि का उपयोग किए बिना संख्यात्मक (जैसे ऐरे) को उलट करने की कोशिश कर रहा हूं, लेकिन reverse_each इटरेटर का उपयोग कर रहा हूं।रुबी

मैं आशा व्यक्त की, कि निम्नलिखित कोड पर्याप्त है:

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 | पीवी}

पैदा करता है:

यह एक अस्थायी सरणी बनाता है और उलटे क्रम में है कि सरणी को पार करता है, लेकिन तब्दील संग्रह के पीछे प्रतिलिपि

कोई ब्लॉक तो नहीं लौटते दिया जाता है, इसके बजाय एक गणक वापस कर दिया जाता है।

लेकिन माणिक के नक्शे विधि

enum में प्रत्येक तत्व के लिए एक बार ब्लॉक चलाने के परिणामों के साथ एक नई सरणी देता है।

पी [1,2,3] .reverse_each.map {| v | v}

reverse_each - एक इटरेटर रूप में कार्य करेगा

मानचित्र - संग्रह