कुछ अच्छे रूबी ट्रिक्स खोज रहे हैं?
आपने उन्हें ढूंढ लिया!
इस लेख में मैं आपके साथ अपने कुछ पसंदीदा साझा करना चाहता हूं।
सामग्री
- 1 डीप कॉपी
- लैम्ब्डा को कॉल करने के 2 अलग-अलग तरीके
- 3 पहले से भरी हुई सरणी बनाना
- 4 सत्य, असत्य और शून्य वस्तुएं हैं
- 5 लैम्ब्डा तर्क-वितर्क को लेकर सख्त हैं, लेकिन प्रक्रिया को कोई परवाह नहीं है
- 6 सीधे irb या फ़ाइलों के बिना कोड निष्पादित करें
- 7 एक कमांड में आपका अपना मिनी-आईआरबी
- 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
), क्योंकि यह वही है जिसे अधिकांश लोग जानते हैं।
पहले से भरी हुई सरणी बनाना
ऐरे वर्ग एक तर्क + एक ब्लॉक ले सकता है, जो आपको n
. के साथ एक सरणी बनाने देता है तत्व डिफ़ॉल्ट रूप से ये तत्व nil
हैं , लेकिन अगर आपके पास कोई ब्लॉक है, तो मान उससे आएंगे।
उदाहरण :
Array.new(10) { rand 300 }
यह 10 यादृच्छिक संख्याओं के साथ एक सरणी उत्पन्न करेगा जो 0 और 299 के बीच है।
सत्य, असत्य और शून्य वस्तुएं हैं
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
काम करता है? खैर, यह इसका अति-सरल संस्करण है।
याद रखें कि 'आरईपीएल' का क्या अर्थ है:रीड-एवल-प्रिंट लूप।
ruby -n -e 'p eval($_)'
आपको कोई संकेत नहीं मिलेगा, लेकिन आगे बढ़ें और कुछ रूबी कोड टाइप करें।
"A" * 5 "AAAAA"
यह काम करता है क्योंकि -n
झंडा यह करता है:
-n assume 'while gets(); ... end' loop around your script
और $_
एक वैश्विक चर है। जिसमें निम्नलिखित शामिल हैं:
The last input line of string by gets or 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
इसे घर पर न आजमाएं!
विशेष पहचान वाली वस्तुएं
रूबी ऑब्जेक्ट्स में एक पहचानकर्ता या 'आईडी' नंबर होता है जिसे आप object_id
. का उपयोग करके एक्सेस कर सकते हैं तरीका। कुछ वस्तुओं की एक निश्चित आईडी होती है:फिक्सनम्स, सही, गलत और शून्य।
false.object_id # 0 true.object_id # 2 nil.object_id # 4 1.object_id # 3 2.object_id # 5
फिक्सनम आईडी इस सूत्र का उपयोग करते हैं:(संख्या * 2) + 1.
बोनस:अधिकतम फिक्सनम 1073741823
. है , उसके बाद आपको एक बिग्नम ऑब्जेक्ट मिलता है।
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)
सारांश
मुझे आशा है कि आपको ये रूबी ट्रिक्स पसंद आई होंगी!
उन्हें अपने दोस्तों के साथ साझा करें ताकि वे भी उनका आनंद उठा सकें और मेरे ब्लॉग की सदस्यता लें नीचे दिए गए फॉर्म में ताकि आप मेरी अगली पोस्ट को मिस न करें।