Array # प्रत्येक बनाम Array # मैप


92
hash = { "d" => [11, 22], "f" => [33, 44, 55] }

# case 1
hash.map {|k,vs| vs.map {|v| "#{k}:#{v}"}}.join(",")
=> "d:11,d:22,f:33,f:44,f:55"

# case 2
hash.map {|k,vs| vs.each {|v| "#{k}:#{v}"}}.join(",")
=> "11,22,33,44,55"

केवल अंतर मामला 1 उपयोग करता है vs.map, केस 2 उपयोग करता है vs.each

यहाँ क्या हुआ?

जवाबों:


174

Array#each सरणी के प्रत्येक तत्व के लिए दिए गए ब्लॉक को निष्पादित करता है, फिर सरणी को ही लौटाता है।

Array#map सरणी के प्रत्येक तत्व के लिए दिए गए ब्लॉक को भी निष्पादित करता है, लेकिन एक नया सरणी देता है जिसके मान ब्लॉक के प्रत्येक पुनरावृत्ति के रिटर्न मान हैं।

उदाहरण: मान लें कि आपके पास एक सरणी है जो इस प्रकार परिभाषित है:

arr = ["tokyo", "london", "rio"]

फिर निष्पादित करने का प्रयास करें each:

arr.each { |element| element.capitalize }
# => ["tokyo", "london", "rio"]

ध्यान दें कि रिटर्न वैल्यू केवल एक ही एरे है। eachब्लॉक के अंदर कोड निष्पादित हो जाता है, लेकिन गणना किए गए मान वापस नहीं किए जाते हैं; और जैसा कि कोड का कोई दुष्प्रभाव नहीं है, यह उदाहरण कोई उपयोगी काम नहीं करता है।

इसके विपरीत, सरणी की mapविधि को कॉल करना एक नया सरणी देता है जिसके तत्व mapब्लॉक निष्पादित करने के प्रत्येक दौर के रिटर्न मान हैं :

arr.map { |element| element.capitalize }
# => ["Tokyo", "London", "Rio"]

समझने के लिए एकदम सही जवाब। बस एक .. अस्वीकरण: यदि आप मानचित्र फ़ंक्शन के रिटर्न मूल्य का उपयोग करते हैं, तो आप संभवतः बहुत अधिक मेमोरी बर्बाद कर सकते हैं।
इमरान अहमद

33

साइड इफेक्ट ही जो अपने रिवर्स इंजीनियरिंग करने के लिए कुछ भ्रम जोड़ रहा है कर रहे हैं।

हां, सरणी पर दोनों पुनरावृति (वास्तव में, कुछ भी जो एनुमेरबल में मिक्स करता है ) लेकिन नक्शा एक सरणी को ब्लॉक परिणामों से बना देगा, जबकि प्रत्येक मूल सरणी को वापस कर देगा।

के रिटर्न मान प्रत्येक सिर्फ मूल सरणी है और शायद ही कभी रूबी कोड में प्रयोग किया जाता है, लेकिन नक्शे में से एक है सबसे महत्वपूर्ण कार्यात्मक उपकरण

क्या mapकरता है एक सरणी लौटाता है जिसमें ब्लॉक या नामित विधि के परिणाम होते हैं जो पारित हो जाते हैं। उदाहरण के लिए:

    2.2.3 :001 > [:how, :now, :brown, :cow].map &:to_s
 => ["how", "now", "brown", "cow"]

इस मामले में मैंने एक ब्लॉक पारित नहीं किया है Symbol, लेकिन सिर्फ एक class Symbolवस्तु है , लेकिन वस्तुओं में एक to_procविधि है जिसके परिणामस्वरूप होगा:

[:how.to_s, :now.to_s, ...]

BTW, आपको प्रलेखन खोजने में कठिन समय हो सकता है क्योंकि नक्शा Enumerable में एक विधि है जबकि प्रत्येक ( Enumerable मॉड्यूल द्वारा आवश्यक एक विधि ) Array में एक विधि है ।

एक सामान्य ज्ञान नोट के रूप में: मानचित्र कार्यान्वयन प्रत्येक पर आधारित है ।


13

यहां बताया गया है कि मानचित्र प्रत्येक से कैसे भिन्न होता है, इसका एक त्वरित डेमो है

a = ["a", "b", "c"];
#Array.map
p a.map {|item| "map_" + item}
#prints ["map_a", "map_b", "map_c"]

#Array.each
p a.each {|item| "map_" + item}
#prints ["a", "b", "c"]

आप देखते हैं कि मैप रिटर्न ["map_a", "map_b", "map_c"]करते समय प्रत्येक बस पुनरावृत्त होता है, लेकिन मूल सरणी देता है ["a", "b", "c"]:।

इसलिए प्रत्येक का उपयोग सरणी को संसाधित करने के लिए किया जाता है और मानचित्र का उपयोग संसाधित सरणी के साथ कुछ करने के लिए किया जाता है।


4

.each आरंभ में आपके द्वारा प्रदान किया गया वही सरणी देता है:

[1,2,3].each { |i| i + 1 }
#=> [1,2,3]

.map प्रत्येक ब्लॉक कॉल के परिणामों में से एक नया ऐरे लौटाता है:

[1,2,3].map { |i| i + 1 }
#=> [2,3,4]

1

सरणी # प्रत्येक विधि समान सरणी देता है

a = [1,2,3,4,5]
a.object_id #70284994490700

b = a.each {|n| n + 2}
p b #[1,2,3,4,5]
b.object_id #70284994490700 <<--- it's the same as a

सरणी # मानचित्र विधि एक नई सरणी देता है

c = [1,2,3,4,5]
c.object_id #70219117705860

d = c.map {|n| n + 2}
p d #[3,4,5,6,7]
d.object_id #70284994343620  <<---- it's different than c

0

जब आप किसी हैश के लिए मानचित्र का उपयोग करते हैं, तो यह आपके पास हैश को एक सरणी में रखता है, इसलिए आपके पास है

[["d", [11, 22]], ["f", [33, 44, 55]]]

vseach {...} केवल आपको अंतिम मूल्यांकन वापस देता है, जो ["d", [11, 22]] और [33, 44, 55] के लिए ["f", [ 33, 44, 55]]। तो आखिरी ज्वाइन करने से पहले आपके पास

[[11, 22], [33, 44, 55]]

0

तुम भी mapधमाके के साथ उपयोग कर सकते हैं map!कि स्रोत सरणी बदलें


यह सवाल का जवाब नहीं है। प्रश्न उस अंतर के बारे में है each, जो दिए गए ब्लॉक को निष्पादित करता है और मूल सरणी देता है; और map, जो ब्लॉक को मान के रूप में निष्पादित करने के परिणाम के साथ एक सरणी देता है
सैम्पसन क्रॉले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.