2012-09-30 12 views
5

Enumerable#each और Enumerable#map के बीच का अंतर यह है कि क्या यह रिसीवर या मैप किए गए परिणाम देता है। रिसीवर को वापस लेना तुच्छ है और आपको आमतौर पर eacheach{...}.another_method के बाद एक विधि श्रृंखला जारी रखने की आवश्यकता नहीं है (मैंने शायद इस तरह के मामले को नहीं देखा है। भले ही आप रिसीवर पर वापस जाना चाहते हैं, आप tap के साथ ऐसा कर सकते हैं)। तो मुझे लगता है कि सभी या अधिकतर मामले जहां Enumerable#each का उपयोग किया जाता है Enumerable#map द्वारा प्रतिस्थापित किया जा सकता है। क्या मै गलत हु? यदि मैं सही हूं, each का उद्देश्य क्या है? mapeach से धीमा है?`प्रत्येक` के सभी या अधिकतर मामलों को 'मानचित्र' के साथ प्रतिस्थापित नहीं किया जा सकता है?

संपादित: मैं जानता हूँ कि each उपयोग करने के लिए जब आप वापसी मान में कोई दिलचस्पी नहीं कर रहे हैं एक आम बात नहीं है। मुझे इस बात का कोई दिलचस्पी नहीं है कि इस तरह की प्रथा मौजूद है या नहीं, लेकिन इस तरह की प्रथा सम्मेलन के दृष्टिकोण से अलग है या नहीं।

+1

आप समझते हैं कि 'प्रत्येक' संख्यात्मक का एक मौलिक हिस्सा है जबकि 'नक्शा' नहीं है, है ना? ["कक्षा को एक विधि 'प्रत्येक' प्रदान करनी चाहिए, जो संग्रह के लगातार सदस्यों को उत्पन्न करती है।"] (Http://ruby-doc.org/core-1.9.3/Enumerable.html)। –

+0

@muistooshort मुझे इसके बारे में पता नहीं था। मैं इसके बारे मैं सोचूंगा। धन्यवाद। – sawa

+2

'प्रत्येक' के संदर्भ में 'मानचित्र' को लागू करने का प्रयास करें और फिर 'प्रत्येक' को 'मानचित्र' के संदर्भ में 'प्रत्येक' को लागू करने का प्रयास करें, जो आपको थोड़ा अंतर्दृष्टि दे सकता है। –

उत्तर

5

map या each के बीच की पसंद वांछित अंत परिणाम द्वारा तय की जानी चाहिए: एक नई सरणी या कोई नई सरणी नहीं। map का परिणाम बहुत बड़ा और/या मूर्ख हो सकता है:

p ("aaaa".."zzzz").map{|word| puts word} #huge and useless array of nil's 
+0

यदि यह धीमा है, तो मैं समझता हूं कि मुझे इसका उपयोग नहीं करना चाहिए, लेकिन यह मूर्ख क्यों है? मैं बिल्कुल समझ में नहीं आता। रुबी को लिस्प से विरासत में मिला कि प्रत्येक मूल्यांकन एक मूल्य देता है। – sawa

+3

इस 'मानचित्र' का नतीजा 456976 नील के साथ एक सरणी है ('puts' एक रिटर्न देता है)। इसे बनाए जाने के बाद छोड़ दिया जाता है। 'प्रत्येक' का उपयोग करके इसे स्मृति को सहेजने में बिल्कुल भी नहीं बनाया होता। (कोड थोड़ा समायोजित) – steenslag

+0

यही वह था जो मैं पूछ रहा हूं। चाहे यह प्रदर्शन के अनुसार अंतर बनाता है। – sawa

2

मैं जो कहता हूं उससे सहमत हूं। Enumerable#each बस उस मूल ऑब्जेक्ट को लौटाता है जिसे Enumerable#map पर रखा गया था, वर्तमान तत्व को ब्लॉक के रिटर्न वैल्यू पर फिर से चालू किया जाता है, और उसके बाद उन परिवर्तनों के साथ एक नई ऑब्जेक्ट देता है।

चूंकि Enumerable#each बस मूल वस्तु को वापस लौटाता है, तो map पर इसे बहुत अच्छी तरह से प्राथमिकता दी जा सकती है जब यह उन मामलों की बात आती है जहां आपको तत्वों को फिर से सक्रिय या पार करने की आवश्यकता होती है।

वास्तव में, Enumerable#each लूप के लिए पारंपरिक पुनरावृत्ति करने का एक सरल और सार्वभौमिक तरीका है, और रूबी में लूप के लिए प्रत्येक को अधिक पसंद किया जाता है।

+0

मुझे ईमानदारी से दिलचस्पी नहीं है कि दूसरे लोग दूसरे तरीके से एक तरीका कैसे पसंद करते हैं। मुझे दिलचस्पी है कि क्या यह 'प्रत्येक' के विशिष्ट उपयोग के लिए समझ में आता है। – sawa

6

अंतर mapeach के बीच और एक एक नई सरणी देता है और अन्य नहीं पड़ता कि कहीं अधिक महत्वपूर्ण है। महत्वपूर्ण अंतर यह है कि वे आपके इरादे को कैसे संवाद करते हैं।

जब आप each का उपयोग करते हैं, तो आपका कोड कहता है "मैं प्रत्येक तत्व के लिए कुछ कर रहा हूं।" जब आप map का उपयोग करते हैं, तो आपका कोड कहता है "मैं प्रत्येक तत्व को बदलकर एक नया सरणी बना रहा हूं।"

तो जब आप mapeach के स्थान पर उपयोग कर सकते हैं, तो प्रदर्शन के बावजूद, कोड अब इसे पढ़ने वाले किसी के इरादे के बारे में झूठ बोल रहा होगा।

0

आप इन enumaratiors लिख रहे हैं, तो आप map और each के बीच महत्वपूर्ण अंतर देख सकते हैं।

उदाहरण के लिए आप इसे में indixes साथ नई सरणी प्राप्त करने की आवश्यकता:

array.each.with_index.map { |index, element| [index, element] } 

या उदाहरण के लिए आप सिर्फ मूल सरणी बदले बिना सरणी और प्रिंट परिणाम के सभी तत्वों के लिए कुछ विधि लागू करने की आवश्यकता:

m = 2.method(:+) 

[1,2,3].each { |a| puts m.call(a) } #=> prints 3, 4, 5 

और वहां एक और उदाहरण हैं जहां each और map के बीच का अंतर कार्यात्मक शैली में लेखन कोड में महत्वपूर्ण कुंजी है।

संबंधित मुद्दे