/ / एक बनाम दो ब्लॉक तर्कों के साथ 'हैश # मैप' को कॉल करना - सरणी, रूबी, हैश

एक बनाम दो ब्लॉक तर्कों के साथ 'हैश # मैप' को कॉल करना - सरणी, रूबी, हैश

कहा पे entries एक हैश है

entries = { foo: 1, bar: 2 }

यह वाक्यविन्यास है जिसे मैं परिचित हूं:

entries.map { |key, val| "#{key} #{val}" }
#=> ["foo 1", "bar 2"]

यह एक वाक्यविन्यास है जो मैं एक ट्यूटोरियल में आया था:

entries.map { |key_val| "#{key_val.first} #{key_val.last}" }
#=> ["foo 1", "bar 2"]

मैं रूबी के लिए नया हूं, इसलिए मुझे आश्चर्य हुआ कि दोनों वाक्यविन्यास भी काम करते हैं। मेरा सवाल है:

  1. क्या दोनों के बीच कोई अंतर है?

  2. यह क्यों काम करता है - ऐसा इसलिए है क्योंकि हैश टेबल ऑब्जेक्ट लागू करता है Enumerable इंटरफ़ेस (जो प्रदान करता है map विधि) दो अलग-अलग तरीकों से?

उत्तर:

जवाब के लिए 5 № 1

नहीं, इसमें हैश और एन्यूमेरबल्स (ठीक है, लगभग) के साथ कुछ लेना देना नहीं है। यह एक चीज है जिसे मैं "सरणी विनाशकारी" कहता हूं। रूबी के पास सरणी अलग करने का एक अच्छा तरीका है। मान लें कि आपके पास यह दो-तत्व सरणी है

ary = [1, 2]

आप अपने तत्वों को व्यक्तिगत रूप से एक्सेस करके प्राप्त कर सकते हैं

a = ary.first # or ary[0]
b = ary.last # or ary[-1]

या इसके बजाय आप चर को सीधे सरणी निर्दिष्ट करके सरणी को "नष्ट" कर सकते हैं

a, b = ary

a सरणी का पहला तत्व होगा, b - दूसरा (आखिरी, इस विशेष मामले में)।

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

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

और हाँ, पहली विधि पसंद करते हैं। अधिक पठनीय।


जवाब के लिए 0 № 2

रुबी में, Hash#each का उपनाम है Hash#each_pair, दूसरे शब्दों में, दोनों विधियों को इंगित करता है एक ही कार्यान्वयन। ब्लॉक पास हो गया each हमेशा दो-तत्व सरणी के रूप में कुंजी-मूल्य जोड़ी प्राप्त करता है।

चूंकि सभी विधियों के बाद से Enumerable मॉड्यूल के आधार पर कार्यान्वित किया जाता है each विधि, सभी समेकित तरीकों में शामिल हैं map कुंजी-मान जोड़ी को सरणी पैरामीटर के रूप में प्राप्त होगा।

यह प्रश्न में उल्लिखित दो वाक्यविन्यासों के उपयोग को सक्षम बनाता है।