रूबी कभी भी सुधार करना बंद नहीं करता!
संस्करण 2.7 नई सुविधाओं, मेथड्स और प्रदर्शन सुधारों के साथ यहां है। यह 25 दिसंबर, 2019 को जारी किया गया था।
अब, मैट्ज़ के अनुसार...
यह अंतिम 2.x संस्करण रिलीज़ है। क्योंकि अगले साल हमें रूबी 3.0 मिल रहा है!
लेकिन इससे पहले कि हम वहां पहुंचें...
आइए 2.7 में कुछ परिवर्तनों और नई सुविधाओं पर एक नज़र डालें, ताकि आप संस्करण अपडेट के लिए तैयार हो सकें।
सामग्री
- 1 Enumerable#tally
- 2 ब्लॉक्स के लिए नंबर पैरामीटर्स [प्रयोगात्मक]
- 3 Array#intersection
- 4 Enumerable#filter_map
- 5 Enumerator#produce
- 6 IRB को नया रूप?
- 7 रूबी पैटर्न मिलान [प्रयोगात्मक]
- 8 अन्य परिवर्तन
- 9 सारांश
- 9.1 संबंधित
Enumerable#tally
यह एक नया रूबी मेथड है जो सरणी में सभी तत्वों को गिनता है और उनकी गणना के साथ एक हैश लौटाता है।
आप इसे स्वयं कर सकते हैं, लेकिन यह tally मेथड आपका काम बचाता है।
यहां एक उदाहरण है:
%w(a a a b b c).tally
जिसके परिणामस्वरूप होता है:
{"a"=>3, "b"=>2, "c"=>1} मुझे यह पसंद है!
ब्लॉक्स के लिए नंबर पैरामीटर्स [प्रयोगात्मक]
एक दिलचस्प नई सुविधा, जिसे मैं कुछ समय से चाहता था, ब्लॉक पैरामीटर्स के लिए डिफ़ॉल्ट नाम है।
यहां एक पैरामीटर के साथ एक नियमित ब्लॉक है:
[1,2,3].each { |n| puts n } यह |n| पैरामीटर है, जिसे आपको इसका उपयोग करने के लिए परिभाषित करना होगा।
लेकिन क्या होगा यदि हमारे पास डिफ़ॉल्ट नाम होता?
खैर, यह उन उपहारों में से एक है जो रूबी 2.7 अपने साथ लाता है, हालांकि प्रयोगात्मक सुविधा के रूप में, यह हमें बहुत सारी टाइपिंग बचा सकता है।
यहां यह कैसा दिखता है:
[1,2,3].each { puts _1 } जहां _1 पहले पैरामीटर को संदर्भित करता है, यदि आपके पास दूसरा है तो आप _2 उपयोग कर सकते हैं, और हाँ, तीसरे पैरामीटर के लिए _3, आदि।
बहुत बढ़िया!
अब, थोड़ा सा ट्रिविया।
यह सुविधा पहली बार @1 की तरह दिखने के लिए प्रस्तावित की गई थी, लेकिन यह इंस्टेंस वेरिएबल की तरह बहुत अधिक दिखता है, इसलिए कुछ चर्चा के बाद, _1 का उपयोग करने पर सहमति बनी।
Array#intersection
यह एक नया मेथड है, लेकिन नई कार्यक्षमता नहीं।
वास्तव में...
यह एक उपनाम की तरह अधिक है!
रूबी 2.6 ने सरणी union और difference मेथड्स पेश किए, Array#| और Array#- के अधिक संक्षिप्त समकक्षों से मेल खाने के लिए।
लेकिन गायब ऑपरेशन intersection था, जिसका एक और याद रखने में कठिन संक्षिप्त संस्करण है।
Array#& मेथड।
अब:
ये मेथड्स क्या करते हैं और कैसे काम करते हैं?
उदाहरण:
[1, 2, 3].intersection([2, 3, 4]) # [2, 3] [1, 2, 3] & [2, 3, 4] # [2, 3]
खैर...
नाम इसका खुलासा करता है, intersection दो सरणियों के बीच इंटरसेक्शन ढूंढता है। दूसरे शब्दों में, यह ढूंढता है कि कौन से एलिमेंट्स सामान्य हैं।
| संक्षिप्त संस्करण | लंबा संस्करण |
|---|---|
| & | intersection |
| | | union |
| - | difference |
मैं हमेशा भूल जाता हूं कि इन 3 मेथड्स में से कौन सा क्या करता है!
लेकिन इन नए मेथड्स के साथ, यह याद रखना बहुत आसान है क्योंकि उनके नाम का अर्थ कुछ है।
यह अच्छा कोड लिखने में एक अच्छा सबक है, बात दें।
Enumerable#filter_map
यह filter_map मेथड select और map मेथड्स को एक में संयोजित करने का एक प्रयास है।
क्यों?
क्योंकि पहले सूची को फ़िल्टर करना, फिर शेष तत्वों को मैप करना एक सामान्य ऑपरेशन है।
आप इसे दो तरीकों से कर सकते हैं:
(1..8).select(&:even?).map { |n| n ** 2 } # OR (1..8).map { |n| n ** 2 if n.even? }.compact मैंने दोनों का उपयोग किया है, लेकिन मैं पहले की ओर झुकता हूं क्योंकि इरादा अधिक स्पष्ट है।
अब:
रूबी 2.7 में, यह filter_map मेथड इसे एक पास में करता है।
इस तरह:
(1..8).filter_map { |n| n ** 2 if n.even? } # [4, 16, 36, 64] मैं ब्लॉक्स के अंदर if स्टेटमेंट्स का सबसे बड़ा प्रशंसक नहीं हूं, लेकिन कभी-कभी काम पूरा करने के लिए उनकी आवश्यकता होती है।
इसके अलावा, कुछ ऐसा है जो आपको पता होना चाहिए।
filter_map ऑपरेशन map + compact की तरह व्यवहार नहीं करता, क्योंकि यह false ऑब्जेक्ट्स को हटा देता है, और compact नहीं करता।
ध्यान रखने योग्य एक अच्छी बात!
Enumerator#produce
यहां एक और नया मेथड है जो आपको दिलचस्प लग सकता है, लेकिन इसका अधिकतम लाभ उठाने के लिए कुछ रचनात्मकता की आवश्यकता हो सकती है।
यह Enumerator#produce मेथड है।
यह क्या करता है?
फीचर प्रस्ताव के अनुसार:
“यह मेथड एक अनंत अनुक्रम उत्पन्न करता है जहां प्रत्येक अगला तत्व पिछले तत्व पर ब्लॉक लागू करके गणना किया जाता है।”
हाँ।
कभी न खत्म होने वाले अनुक्रम बनाने का एक और तरीका!
यहां एक उदाहरण है:
Enumerator.produce(1, &:next).take(5) # [1, 2, 3, 4, 5]
इस उदाहरण में, इससे कोई फर्क नहीं पड़ता कि आप take(10) या take(10_000) करते हैं, आपको इससे अनंत संख्या में मान मिलेंगे।
बात दें, 1 प्रारंभिक मान है।
और &:next उस मान पर कॉल की गई मेथड है जो अनुक्रम में अगले एलिमेंट को produce करती है।
IRB को नया रूप?
हाल ही में, IRB को कुछ प्यार और ध्यान मिल रहा है, और रूबी 2.7 इसमें जोड़ता रहता है।
हमें मिल रहा है:
- मल्टी-लाइन एडिटिंग
- सिंटैक्स हाइलाइटिंग
- बिल्ट-इन RDoc एकीकरण
- डिफ़ॉल्ट रूप से सक्षम कमांड हिस्ट्री
- डिफ़ॉल्ट रूप से सक्षम ऑटो-कंप्लीशन
वास्तव में:
यह इतना बड़ा बदलाव है कि जब आप रूबी 2.7 के साथ irb शुरू करते हैं तो आपको चेतावनी मिलती है।
यदि आप IRB के पुराने संस्करण का उपयोग जारी रखना चाहते हैं तो आप अभी भी कर सकते हैं, irb --legacy कमांड के साथ। मेरी मुख्य समस्या इस नए IRB के साथ लाइन एडिटिंग है, लिगेसी IRB (या प्राई में) मैं ALT दबाकर और बाएं तीर दबाकर तेजी से आगे बढ़ सकता हूं, लेकिन यह नए IRB में काम नहीं करता।
इसे आज़माएं और देखें कि यह आपके लिए कैसे काम करता है।
रूबी पैटर्न मिलान [प्रयोगात्मक]
एक अक्सर अनुरोधित सुविधा जो 2.7 में आ रही है वह है पैटर्न मिलान।
यह प्रयोगात्मक के रूप में चिह्नित है।
लेकिन पैटर्न मिलान क्या है और यह आपको कैसे लाभ पहुंचाता है?
खैर, यदि मैं इसे सही ढंग से समझता हूं, तो पैटर्न मिलान नियमित अभिव्यक्तियों की तरह है, लेकिन डेटा संरचनाओं (सरणी/हैश) के लिए।
यहां एक उदाहरण है:
[1,2,3] in [a,b,c] # true [1,2,3] in [a] # false
यदि कोई मिलान है, तो ये वेरिएबल नाम (जैसे a) लोकल वेरिएबल्स बन जाते हैं जिन्हें आप एक्सेस कर सकते हैं।
हैश के साथ उदाहरण:
{ a: 1, b: 2, c: [] } in { a: a, b: b, c: [] } # true p a # 1 यह in कीवर्ड का उपयोग करता है।
यह नया नहीं है, लेकिन असामान्य है क्योंकि रूबी 2.7 से पहले in का उपयोग केवल for लूप के हिस्से के रूप में किया जाता था (रूबी में अत्यधिक हतोत्साहित), इसलिए हम इस कीवर्ड को किसी उपयोगी चीज़ के लिए पुन: उपयोग करते हैं।
यहां तक कि बेहतर...
इससे कोई फर्क नहीं पड़ता कि आप किन वेरिएबल्स का उपयोग करते हैं, a,b,c यहां काम करता है, लेकिन f,g,h भी काम करता है।
यह सब पैटर्न के बारे में है!
अन्य परिवर्तन
कुछ अतिरिक्त परिवर्तन जो उल्लेख के लायक हैं।
- नया कॉम्पैक्शन GC मेमोरी फ्रैगमेंटेशन में सुधार करता है
- मेथड आर्ग्युमेंट
**nilअब घोषित करता है कि एक मेथड कोई कीवर्ड नहीं लेता - मेथड आर्ग्युमेंट
...एक आर्ग्युमेंट फॉरवर्डिंग तंत्र जोड़ता है (पैरेंथेसिस आवश्यक, जैसेmake_salad(...)) - फाइबर सुधार। फाइबर ऑब्जेक्ट्स का एक नया पूल (जिससे नए फाइबर आवंटित किए जाते हैं) फाइबर्स को अधिक कुशल बनाता है
- थ्रेड सुधार। थ्रेड्स बनाने का एक बेहतर, अधिक अनुकूलित तरीका मल्टी-थ्रेडिंग को तेज़ बनाता है
आप इनके बारे में क्या सोचते हैं?
2.7 के लिए NEWS फ़ाइल फाइबर और थ्रेड निर्माण दोनों के लिए 10x प्रदर्शन सुधार का उल्लेख करती है, मैंने इसे स्वयं टेस्ट नहीं किया है, लेकिन यदि आप करते हैं तो मुझे अपने परिणामों के बारे में बताएं।
सारांश
अब आप रूबी प्रोग्रामिंग भाषा में नवीनतम परिवर्तनों के साथ अद्यतित हैं! आपने IRB परिवर्तनों, नए मेथड्स और पैटर्न मिलान जैसी कुछ प्रयोगात्मक सुविधाओं के बारे में सीखा।
कृपया इस लेख को साझा करके खबर फैलाएं!
पढ़ने के लिए धन्यवाद 🙂