जब आप अपने संग्रह को गणक के रूप में मानते हैं, तो आप बिना किसी अतिरिक्त कोड को लिखे अपने सभी पसंदीदा कार्यों जैसे #map और #reduce का उपयोग कर सकते हैं। यह बहुत बढ़िया है।
पुराने दिनों में, गणनाकर्ताओं को परिभाषित करना थोड़ा बोझिल था। आपको एक नया वर्ग बनाना था, संख्यात्मक मॉड्यूल शामिल करना था, और एक #प्रत्येक फ़ंक्शन को परिभाषित करना था।
रूबी 1.9 के बाद से, हमारे पास फ्लाई पर एन्यूमरेटर्स को परिभाषित करने का एक और हल्का तरीका है। आइए एक नज़र डालते हैं।
एन्यूमरेटर वर्ग का परिचय
एन्यूमरेटर क्लास आपको ब्लॉक सिंटैक्स का उपयोग करके एक बार के एन्यूमरेटर को परिभाषित करने देता है। नीचे दिए गए उदाहरण में, हम एक एन्यूमरेटर बनाते हैं जो यादृच्छिक संख्याओं की एक अनंत श्रृंखला देता है।
e = Enumerator.new do |y|
loop do
y << rand(10) # The << operator "yields" a value.
end
end
# Make the enumerator "yield" 10 values, then stop
puts e.first(10).inspect # => [6, 6, 7, 2, 2, 9, 6, 8, 2, 1]
आपने देखा होगा कि हम शिफ्ट ऑपरेटर का उपयोग कर रहे हैं <<
एक अजीब तरह से। यह y.yield
. के लिए एक शॉर्टकट है तरीका। आप इसे एन्यूमरेटर में प्रत्येक आइटम के लिए कॉल करेंगे। अगर यह सब आपको थोड़ा जादुई लगता है, तो चिंता न करें। यह है।
संग्रह का आकार
संग्रह के आकार का पता लगाना रूबी के आलसी गणकों के लिए एक समस्या है। संग्रह में आइटम गिनने के लिए, आपको पूरे संग्रह को लोड करना होगा - जो आलसी गणनाकर्ताओं के उपयोग के पूरे बिंदु के विरुद्ध है।
एक कामकाज है, तरह का। यदि आप गणनाकर्ता बनाते समय संग्रह के आकार को जानते हैं, तो आप इसे प्रदान कर सकते हैं।
# You can pass the length as an argument to the constructor, if you have it
e = Enumerator.new(10) do |y|
10.times { y << rand }
end
मेरा असली दुनिया का उदाहरण
कल ही मैं हनीबैगर की नई प्रलेखन साइट पर काम कर रहा था। यह Jekyll का उपयोग करके बनाया गया है, और मैं <h2>
के आधार पर सामग्री की एक तालिका बनाने के लिए एक प्लगइन लिख रहा था। और <h3>
दस्तावेज़ीकरण में टैग।
यह पता लगाना अजीब है कि कौन सा <h3>
टैग <h2>
. द्वारा परिभाषित एक अनुभाग से संबंधित हैं टैग। आपको नोकोगिरी का उपयोग करके HTML को पार्स करना होगा, और फिर परिणामी दस्तावेज़ को स्कैन करना होगा। इसलिए मैंने उस बिट कोड को सारणित किया और इसे एक एन्यूमरेटर बना दिया। यह कैसा दिखता है।
def subheadings(el)
Enumerator.new do |y|
next_el = el.next_sibling
while next_el && next_el.name != "h2"
if next_el.name == "h3"
y << next_el
end
next_el = next_el.next_sibling
end
end
end