कुछ कूल रूबी ट्रिक्स ढूंढ रहे हैं?
आपने उन्हें पा लिया!
इस लेख में मैं आपके साथ अपने कुछ पसंदीदा साझा करना चाहता हूं।
विषयसूची
- 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)
सारांश
मुझे आशा है कि आपको ये रूबी ट्रिक्स पसंद आई होंगी!
उन्हें अपने दोस्तों के साथ शेयर करें ताकि वे भी उनका आनंद ले सकें और मेरे ब्लॉग की सदस्यता लें नीचे दिए गए फॉर्म में ताकि आप मेरी अगली पोस्ट से न चूकें। 🙂