Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

11 उन्नत रूबी तकनीकें जो आप शायद चूक गए

कुछ कूल रूबी ट्रिक्स ढूंढ रहे हैं?

आपने उन्हें पा लिया!

इस लेख में मैं आपके साथ अपने कुछ पसंदीदा साझा करना चाहता हूं।

विषयसूची

  • 1 डीप कॉपी
  • 2 लैम्ब्डा को कॉल करने के विभिन्न तरीके
  • 3 प्री-फिल्ड सरणी बनाना
  • 4 True, false और nil ऑब्जेक्ट्स हैं
  • 5 लैम्ब्डा तर्कों के बारे में सख्त हैं, लेकिन प्रॉक्स को परवाह नहीं
  • 6 irb या फाइलों के बिना सीधे कोड निष्पादित करें
  • 7 एक कमांड में अपना खुद का मिनी-irb
  • 8 एक ऑब्जेक्ट को अनफ्रीज करें (खतरा!)
  • 9 विशेष पहचान वाले ऑब्जेक्ट्स
  • 10 irb या pry में बड़ा आउटपुट टालें
  • 11 कॉलर मेथड का उपयोग करके वर्तमान कॉल स्टैक प्राप्त करें
  • 12 बोनस! किसी भी मान को बूलियन में बदलें
  • 13 बोनस! एक कीवर्ड को वेरिएबल नाम के रूप में उपयोग करें
  • 14 सारांश
    • 14.1 संबंधित

डीप कॉपी

जब आप एक ऐसे ऑब्जेक्ट को copy करते हैं जिसमें अन्य ऑब्जेक्ट्स होते हैं, जैसे Array, तो केवल इन ऑब्जेक्ट्स का एक संदर्भ कॉपी किया जाता है।

आप इसे यहां कार्रवाई में देख सकते हैं:

 food = %w( bread milk orange )
food.map(&:object_id) # [35401044, 35401020, 35400996]
food.clone.map(&:object_id) # [35401044, 35401020, 35400996] 

Marshal क्लास का उपयोग करके, जो आमतौर पर सीरियलाइज़ेशन के लिए उपयोग किया जाता है, आप एक ऑब्जेक्ट की 'डीप कॉपी' बना सकते हैं।

 def deep_copy(obj)
  Marshal.load(Marshal.dump(obj))
end 

परिणाम:

 deep_copy(food).map(&:object_id) # [42975648, 42975624, 42975612] 

लैम्ब्डा को कॉल करने के विभिन्न तरीके

 my_lambda = -> { puts 'Hello' }
my_lambda.call
my_lambda[]
my_lambda.()
my_lambda.=== 

यदि संभव हो, तो आपको पहले वाले (call) के साथ रहना चाहिए, क्योंकि यह वही है जिसे ज्यादातर लोग जानते हैं।

प्री-फिल्ड सरणी बनाना

Array क्लास एक तर्क + एक ब्लॉक ले सकती है, जो आपको n एलिमेंट्स के साथ एक सरणी बनाने देता है। डिफ़ॉल्ट रूप से ये एलिमेंट्स nil हैं, लेकिन यदि आपके पास एक ब्लॉक है, तो मान उससे आएंगे।

उदाहरण:

 Array.new(10) { rand 300 } 

यह 10 रैंडम नंबर्स की एक सरणी उत्पन्न करेगा जो 0 और 299 के बीच हैं।

True, false और nil ऑब्जेक्ट्स हैं

 true.class # TrueClass
false.class # FalseClass
nil.class # NilClass 

इन ऑब्जेक्ट्स की केवल एक प्रति मौजूद है, और आप चाहकर भी अधिक नहीं बना सकते।

यह सिंगलटन पैटर्न की कार्रवाई में है।

लैम्ब्डा तर्कों के बारे में सख्त हैं, लेकिन प्रॉक्स को परवाह नहीं

 my_lambda = ->(a, b) { a + b }
my_proc = Proc.new { |a, b| a + b }
my_lambda.call(2) # ArgumentError: wrong number of arguments (1 for 2)
my_proc.call(2) # TypeError: nil can't be coerced into Fixnum 

irb या फाइलों के बिना सीधे कोड निष्पादित करें

ruby कमांड में कई दिलचस्प विकल्प हैं जिनका आप उपयोग कर सकते हैं।

उदाहरण के लिए, -e फ्लैग के साथ आप निष्पादित किए जाने वाले कोड का एक स्निपेट पास कर सकते हैं।

 ruby -e '5.times { puts "Fun with Ruby" }' 

आप -h फ्लैग का उपयोग करके अधिक पा सकते हैं।

एक कमांड में अपना खुद का मिनी-irb

कभी जानना चाहा कि irb कैसे काम करता है? खैर, यह उसका सुपर-सिंपल संस्करण है।

याद रखें कि 'REPL' का क्या अर्थ है: रीड-इवैल-प्रिंट लूप।

 ruby -n -e 'p eval($_)' 

आपको प्रॉम्प्ट नहीं मिलेगा, लेकिन आगे बढ़ें और कुछ रूबी कोड टाइप करें।

 "A" * 5
"AAAAA" 

यह काम करता है क्योंकि -n फ्लैग यह करता है:

 -n assume 'while gets(); ... end' loop around your script 

और $_ एक ग्लोबल वेरिएबल है। जिसमें निम्न होता है:

 gets या readline द्वारा स्ट्रिंग की अंतिम इनपुट लाइन। 

एक ऑब्जेक्ट को अनफ्रीज करें (खतरा!)

रूबी में ऑब्जेक्ट को अनफ्रीज करने के लिए कोई मेथड नहीं है, लेकिन Fiddle क्लास का उपयोग करके आप रूबी इंटर्नल्स में पहुंचकर ऐसा कर सकते हैं।

 require 'fiddle'
str = 'water'.freeze
str.frozen? # true
memory_address = str.object_id * 2
Fiddle::Pointer.new(memory_address)[1] &= ~8
str.frozen? # false 

इसे घर पर न आजमाएं!

विशेष पहचान वाले ऑब्जेक्ट्स

रूबी ऑब्जेक्ट्स का एक पहचानकर्ता या 'id' नंबर होता है जिसे आप object_id मेथड का उपयोग करके एक्सेस कर सकते हैं। कुछ ऑब्जेक्ट्स की एक निश्चित id होती है: Fixnums, true, false और nil।

 false.object_id # 0
true.object_id # 2
nil.object_id # 4
1.object_id # 3
2.object_id # 5 

Fixnum ids इस फॉर्मूला का उपयोग करते हैं: (संख्या * 2) + 1।

बोनस: अधिकतम Fixnum 1073741823 है, उसके बाद आपको एक Bignum ऑब्जेक्ट मिलता है।

irb या pry में बड़ा आउटपुट टालें

यदि आप irb में काम कर रहे हैं और वास्तव में बड़े सरणी या स्ट्रिंग की सामग्री से अपनी स्क्रीन भरने से बचना चाहते हैं तो आप बस अपने कोड के अंत में ; जोड़ सकते हैं।

उदाहरण:

 require 'rest-client'
RestClient.get('www.rubyguides.com'); 

; के बिना फिर से आज़माएं अंतर देखने के लिए 🙂

कॉलर मेथड का उपयोग करके वर्तमान कॉल स्टैक प्राप्त करें

यहां एक कोड उदाहरण है:

 def foo
  bar
end
def bar
  puts caller
end
foo 

आउटपुट:

 -:3:in 'foo'
-:10:in '<main>' 

यदि आपको वर्तमान मेथड नाम चाहिए तो आप __method__ या __callee__ का उपयोग कर सकते हैं।

बोनस! किसी भी मान को बूलियन में बदलें

 !!(1) # true
!!(nil) # false 

बोनस! एक कीवर्ड को वेरिएबल नाम के रूप में उपयोग करें

 def foo (if: nil)
  binding.local_variable_get(:if)
end
foo(if: true) 

सारांश

मुझे आशा है कि आपको ये रूबी ट्रिक्स पसंद आई होंगी!

उन्हें अपने दोस्तों के साथ शेयर करें ताकि वे भी उनका आनंद ले सकें और मेरे ब्लॉग की सदस्यता लें नीचे दिए गए फॉर्म में ताकि आप मेरी अगली पोस्ट से न चूकें। 🙂


  1. रूबी के लिए Atom एडिटर: टॉप प्लगइन्स और आवश्यक शॉर्टकट्स रूबी के लिए Atom एडिटर: टॉप प्लगइन्स और आवश्यक शॉर्टकट्स

    यदि आप रूबी डेवलपमेंट के लिए Atom का उपयोग कर रहे हैं तो आप शायद जानते हैं कि प्लगइन्स (Atom में packages) हैं जो एडिटर के साथ आपकी उत्पादकता में सुधार कर सकते हैं। लेकिन Atom के पैकेज रिपॉजिटरी में हजारों पैकेज हैं! आपको किन लोगों का उपयोग करना चाहिए? और इसके अलावा, कुछ उपयोगी कीबोर्ड शॉर्टकट्स क्य

  1. रूबी कॉन्स्टेंट्स में महारत: परिभाषा, उपयोग और सर्वोत्तम अभ्यास रूबी कॉन्स्टेंट्स में महारत: परिभाषा, उपयोग और सर्वोत्तम अभ्यास

    रूबी में कॉन्स्टेंट क्या है? एक कॉन्स्टेंट एक प्रकार का वेरिएबल है जो हमेशा एक बड़े अक्षर से शुरू होता है। उन्हें केवल मेथड्स के बाहर परिभाषित किया जा सकता है, जब तक कि आप मेटाप्रोग्रामिंग का उपयोग न करें। कॉन्स्टेंट्स का उपयोग उन मानों के लिए किया जाता है जो बदलने वाले नहीं होते, लेकिन रूबी आपको उन

  1. Apple TV 4K मास्टरी: 10 आवश्यक टिप्स और ट्रिक्स Apple TV 4K मास्टरी: 10 आवश्यक टिप्स और ट्रिक्स

    क्या आपको नया Apple TV मिला? आगे पढ़ें! कुछ समय हो गया है जब Apple ने अपना पहला Apple TV जारी किया था। हालांकि, समय बीतने और प्रौद्योगिकी में प्रगति के साथ, Apple स्पष्ट रूप से प्रत्येक उत्तराधिकारी के साथ विकसित हुआ है। उन सभी में सबसे हालिया है हाल ही में जारी Apple TV 4K। Apple TV 4K एक अत्यंत उ