क्रिसमस पर रूबी के नए संस्करण जारी करने की परंपरा बन गई है।
और इस पोस्ट में मैं रूबी 2.4 में कुछ सबसे दिलचस्प बदलावों को कवर करना चाहता हूं ताकि आप खबरों के साथ बने रह सकें 🙂
कीवर्ड के साथ #दौर फ़्लोट करें
यदि आप अपने ऐप में फ्लोट्स का उपयोग कर रहे हैं तो मुझे आशा है कि आप floor
. का उपयोग करेंगे या ceil
गोलाई के लिए, क्योंकि फ़्लोट#राउंड विधि रूबी 2.4 में अपने डिफ़ॉल्ट व्यवहार को बदल रही है।
उदाहरण :
# Ruby 2.3 (2.5).round 3 # Ruby 2.4 (2.5).round 2
डिफ़ॉल्ट व्यवहार अब "राउंड-टू-निकटतम-सम" है।
<ब्लॉककोट>
अपडेट करें :Float#round
. के लिए डिफ़ॉल्ट व्यवहार Ruby 2.4
. के अंतिम संस्करण में "राउंडिंग अप" पर वापस आ गया है . यह पोस्ट मूल रूप से प्रकाशित होने के बाद Matz द्वारा लिया गया निर्णय था।
इसके अलावा, Float#round
अब एक तर्क लेता है जिसका उपयोग आप अपनी इच्छित गोलाई के प्रकार को परिभाषित करने के लिए कर सकते हैं।
विकल्प हैं:
- :यहां तक कि
- :ऊपर
- :नीचे
उदाहरण :
(4.5).round(half: :up) 5
साथ ही Float#floor
, Float#ceil
&Float#truncate
अब एक वैकल्पिक तर्क लें जो आपको सटीक सेट करने देता है।
आईओ विधियों के लिए चॉम्प फ्लैग
यदि आपने कभी get या प्रत्येक_लाइन जैसी विधि का उपयोग किया है, तो मुझे यकीन है कि आपको उन अजीब नए लाइन वर्णों से निपटना याद होगा।
जो इस तरह दिखते हैं:\n
।
यह एक ऐसी चीज है जिससे शुरुआती लोगों को हमेशा परेशानी होती है, लेकिन यह नई सुविधा मदद कर सकती है!
यहां एक उदाहरण दिया गया है:
input = gets.chomp # "abc\n"
अब रूबी 2.4 में आप chomp
. सेट कर पाएंगे कीवर्ड तर्क और gets
आपके लिए न्यूलाइन कैरेक्टर को हटा देगा।
उदाहरण :
input = gets(chomp: true) # "abc"
यह किसी भी मान के साथ काम करेगा जो false
नहीं है या nil
(रूबी में केवल "गलत" मान)।
तो यह भी काम करता है (लेकिन अनुशंसित नहीं है क्योंकि यह भ्रमित करने वाला हो सकता है):
input = gets(chomp: 1234) # "abc"
यह कोई बड़ी बात नहीं है, लेकिन यह आपको एक विधि कॉल
. से बचा सकता हैपथनाम#खाली?
रूबी 2.4 लागू करता है Dir#empty?
&File#empty?
, इन विधियों से आप जांच सकते हैं कि कोई निर्देशिका या फ़ाइल खाली है या नहीं (यह बहुत स्पष्ट था, है ना?)।
लेकिन Pathname#empty?
हाल ही में जोड़ा गया था।
यदि आप Pathname
. से परिचित नहीं हैं तो , यह एक ऐसा वर्ग है जो Dir
. दोनों की कार्यक्षमता को एक साथ मिलाता है वर्ग और File
कक्षा।
इसके अलावा, यह इस अर्थ में अधिक "OO" (ऑब्जेक्ट ओरिएंटेड) है कि यह Pathname
लौटाता है स्ट्रिंग्स के बजाय ऑब्जेक्ट।
उदाहरण :
Pathname.empty?("file or directory name")
प्रतिबद्ध:https://github.com/ruby/ruby/commit/9373c5efb993dd8cae0526118805449b19af2c22
तुलना_बाई_पहचान सेट करें
सेट एक डेटा संरचना है जो मानक पुस्तकालय के हिस्से के रूप में उपलब्ध है। यह अद्वितीय वस्तुओं का संग्रह रखने में आपकी सहायता करता है।
डिफ़ॉल्ट रूप से वस्तुओं की तुलना उनके मूल्य के आधार पर की जाती है (या अधिक सटीक होने के लिए, उनके हैश मान के आधार पर)।
लेकिन रूबी 2.4 में उनके ऑब्जेक्ट आईडी के आधार पर अद्वितीय वस्तुओं का एक सेट होना संभव है।
उदाहरण :
require 'set' # Normal set set = Set.new set << 123 << 123 << "abc" << "abc" # [123, "abc"] # Identity set set = Set.new().compare_by_identity set << 123 << 123 << "abc" << "abc" # [123, "abc", "abc"]
अगर किसी को इस सुविधा के किसी दिलचस्प उपयोग के बारे में पता है तो एक टिप्पणी छोड़ दें 🙂
प्रतिबद्ध:https://github.com/ruby/ruby/commit/76977611dd68e384fdce8c546efda5e1931e67a6
कर्नेल के साथ परिशोधन#भेजें, BasicObject#भेजें , प्रतीक#to_proc
मैं यहां विस्तार से शोधन को कवर नहीं करने जा रहा हूं, लेकिन मूल विचार यह है कि String
जैसी कक्षा में विधियों को जोड़ने में सक्षम होना चाहिए। , इस परिवर्तन को एक फ़ाइल या वर्ग में "स्थानीयकृत" रखते हुए।
रूबी 2.4 के बाद से, Kernel#send
जैसी विधियों के माध्यम से कॉल किए जाने पर परिशोधन के माध्यम से परिभाषित विधियां उपलब्ध होंगी &Symbol#to_proc
।
उदाहरण :
module TenTimes refine String do def ten_times puts self * 10 end end end class Thing using TenTimes "abc".send(:ten_times) end
यदि आप इसे 2.3 या उससे कम में आजमाते हैं तो आपको 'अपरिभाषित विधि' त्रुटि मिलेगी।
प्रतिबद्ध:https://github.com/ruby/ruby/commit/35a29390197750abf97ef16fa0740e377764daef
हैश#transform_values
रेल से निकाली गई और सीधे रूबी में आने वाली एक और विधि यहां दी गई है। मैं बात कर रहा हूँ Hash#transform_values
, जो Array#map
. के समान कार्य करता है ।
उदाहरण :
h = {a: 1, b: 2, c: 3} h.transform_values { |v| v * 10 } # {a: 10, b: 20, c: 30}
Hash#transform_values!
. भी है अगर आपको इन-प्लेस म्यूटेशन की जरूरत है।
Kernel#clone अब एक वैकल्पिक कीवर्ड तर्क लेता है
जैसा कि आप जानते हैं, रूबी ऑब्जेक्ट की प्रतिलिपि बनाना संभव है। यह उपयोगी है क्योंकि अधिकांश रूबी वस्तुएं परिवर्तनशील हैं और आप मूल वस्तु में परिवर्तन करने से बचना चाह सकते हैं।
ऑब्जेक्ट कॉपी बनाने के लिए हमारे पास दो तरीके हैं:
- क्लोन
- डुप
क्लोन और डुप के बीच कुछ छोटे अंतर हैं, लेकिन इस पोस्ट के लिए हम केवल यह कहते हैं कि clone
dup
. के दौरान मूल वस्तु की "जमे हुए" स्थिति को बनाए रखता है नहीं।
2.4 में नया clone
को कॉल करने की क्षमता है "फ्रीज" ध्वज के साथ।
उदाहरण :
foo = "test".freeze boo = foo.clone(freeze: false) boo.frozen? # false
मुझे यकीन नहीं है कि यह किस विस्तार के लिए उपयोगी है, लेकिन कौन अधिक विकल्प नहीं चाहता 🙂
कमिट करें:https://github.com/ruby/ruby/commit/320ae01c5fb091eab0926c186f304a9caeda1ace
Thread.report_on_exception
2.4 के साथ आने वाली एक अन्य विशेषता Thread.report_on_exception है। यह प्रस्तावित किया गया था क्योंकि थ्रेड अपवाद डिफ़ॉल्ट रूप से मौन होते हैं, और यह आपके कोड के साथ समस्याओं को छिपा सकता है।
डिफ़ॉल्ट मान false
है , लेकिन यदि आपका ऐप थ्रेड का उपयोग कर रहा है, तो आपको रूबी 2.4 में अपग्रेड करते समय इसे सक्षम करने का प्रयास करना चाहिए।
उदाहरण :
Thread.report_on_exception = true t1 = Thread.new do puts "In new thread" raise "Exception from thread" end sleep(1) puts "In the main thread"
यह अपवाद दिखाएगा, लेकिन यह आपके प्रोग्राम को क्रैश नहीं करेगा। विकल्प Thread.abort_on_exception है, जो हमेशा से उपलब्ध रहा है।
ध्यान दें कि इस पद्धति का एक उदाहरण संस्करण भी है, इसलिए आप इस विकल्प को सभी थ्रेड्स के बजाय प्रति-थ्रेड सेट कर सकते हैं।
बाइंडिंग#irb
क्या आप binding.pry
. का उपयोग करने के प्रशंसक हैं? डिबगिंग के लिए? खैर अब हमारे पास binding.irb
भी है जो इसी तरह काम करता है।
लेकिन चूंकि यह irb है, आपको अभी भी वे सभी अच्छी चीज़ें नहीं मिलती हैं जो pry आपको देती हैं, जैसे वाक्य रचना हाइलाइटिंग।
कुछ नहीं से बेहतर अगर किसी कारण से आपके पास pry तक पहुंच नहीं है
कमिट करें:https://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a
निष्कर्ष
रूबी के इस नए संस्करण में कई दिलचस्प विशेषताएं हैं, इसलिए उपलब्ध होने पर इसे देखना सुनिश्चित करें।
इस पोस्ट को शेयर करना न भूलें ताकि और लोग सीख सकें रूबी 2.4 में इन नई सुविधाओं के बारे में!