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

रूबी में 'स्व' को समझना

आज मैं self के बारे में बात करना चाहता हूं . यदि आप कुछ समय से रूबी की प्रोग्रामिंग कर रहे हैं, तो संभवतः आपने self . के विचार को आंतरिक कर दिया है . जब भी आप कोई प्रोग्राम पढ़ते या लिखते हैं, self आपके दिमाग के पीछे है।

लेकिन कम-अनुभवी रूबीवादियों के लिए, self चौंकाने वाला हो सकता है। यह हमेशा बदलता रहता है, लेकिन यह कभी भी कोड में स्पष्ट रूप से नहीं दिखाया जाता है। आपसे बस जानने की उम्मीद है।

self . को न समझने के कारण शुरुआती लोगों को बहुत सी समस्याओं का सामना करना पड़ता है . यदि आपने कभी किसी आवृत्ति चर को "खो" दिया है या किसी मिश्रण को कौन सा डेटा दिखाई दे रहा है, इस पर आप हैरान हैं, तो इसका कारण यह है कि आप self को नहीं समझ पाए हैं उस संदर्भ में।

इस पोस्ट में, हम self . को देखने जा रहे हैं हर दिन की विभिन्न स्थितियों में।

self ?

आपने लोगों को यह कहते सुना होगा कि रूबी में सब कुछ एक वस्तु है। अगर यह सच है तो इसका मतलब है कि आपके द्वारा लिखा गया प्रत्येक कोड किसी न किसी वस्तु से संबंधित है।

self एक विशेष चर है जो उस वस्तु को इंगित करता है जो वर्तमान में निष्पादित कोड का "मालिक" है। रूबी self का उपयोग करती है हर जगह:

  • उदाहरण के लिए चर:@myvar
  • विधि और निरंतर खोज के लिए
  • विधियों, वर्गों और मॉड्यूल को परिभाषित करते समय।

सिद्धांत रूप में, self काफी स्पष्ट है। लेकिन व्यवहार में, मुश्किल परिस्थितियों के लिए पॉप अप करना आसान है। इसलिए मैंने यह पोस्ट लिखी है।

self के उदाहरण

हम अब कई उदाहरणों के माध्यम से कदम उठाने जा रहे हैं। यदि पहले वाले आपको बहुत बुनियादी लगते हैं, तो बस पढ़ते रहें। वे और अधिक उन्नत हो जाते हैं।

इंस्टेंस विधि के अंदर

नीचे दिए गए कोड में, reflect एक उदाहरण विधि है। यह हमारे द्वारा बनाई गई वस्तु से संबंधित है Ghost.new . तो self उस वस्तु की ओर इशारा करता है।

class Ghost
  def reflect
    self
  end
end

g = Ghost.new
g.reflect == g # => true

इनसाइड ऑफ़ ए क्लास मेथड

इस उदाहरण के लिए, reflect Ghost . की एक वर्ग विधि है . वर्ग विधियों के साथ, वर्ग स्वयं विधि का "मालिक" है। self कक्षा की ओर इशारा करता है।

class Ghost
  def self.reflect
    self
  end
end

Ghost.reflect == Ghost # => true

यह मॉड्यूल के अंदर "वर्ग" विधियों के साथ समान काम करता है। उदाहरण के लिए:

module Ghost
  def self.reflect
    self
  end
end 
Ghost.reflect == Ghost # => true

याद रखें, रूबी में कक्षाओं और मॉड्यूल को वस्तुओं के रूप में माना जाता है। तो यह व्यवहार पहले उदाहरण में देखे गए उदाहरण विधि व्यवहार से अलग नहीं है।

एक वर्ग या मॉड्यूल परिभाषा के अंदर

रूबी की एक विशेषता जो इसे रेल जैसे ढांचे के लिए इतना उपयुक्त बनाती है कि आप कक्षा और मॉड्यूल परिभाषाओं के अंदर मनमाना कोड निष्पादित कर सकते हैं। जब आप किसी वर्ग/मॉड्यूल परिभाषा के अंदर कोड डालते हैं, तो यह किसी अन्य रूबी कोड की तरह ही चलता है। केवल वास्तविक अंतर self . का मान है .

जैसा कि आप नीचे देख सकते हैं, self उस वर्ग या मॉड्यूल को इंगित करता है जो परिभाषित होने की प्रक्रिया में है।

class Ghost
  self == Ghost # => true
end 

module Mummy
  self == Mummy # => true
end 

इनसाइड मिक्सिन मेथड्स

जब बात self की आती है तो मिश्रित तरीके "सामान्य" उदाहरण या वर्ग विधियों की तरह ही व्यवहार करते हैं . यह समझ में आता है। अन्यथा मिक्सिन उस क्लास के साथ इंटरैक्ट नहीं कर पाएगा जिसमें आपने उसे मिक्स किया था।

इंस्टेंस विधियां

भले ही reflect विधि को मॉड्यूल में परिभाषित किया गया था, इसका self उस वर्ग का उदाहरण है जिसमें इसे मिश्रित किया गया था।

module Reflection
  def reflect
    self
  end
end 

class Ghost
  extend Reflection
end

Ghost.reflect == Ghost # => true

कक्षा विधियां

जब हम extend . करते हैं कक्षा विधियों में मिश्रण करने के लिए एक वर्ग, self बिल्कुल वैसा ही व्यवहार करता है जैसा वह सामान्य वर्ग विधियों में करता है।

module Reflection
  def reflect
    self
  end
end 

class Ghost
  extend Reflection
end

Ghost.reflect == Ghost # => true

मेटाक्लास के अंदर

संभावना है कि आपने कई क्लास विधियों को एक साथ परिभाषित करने के लिए यह लोकप्रिय शॉर्टकट देखा है।

class Ghost
  class << self 
    def method1
    end

    def method2
    end
  end
end

class << foo वाक्य रचना वास्तव में बहुत दिलचस्प है। यह आपको किसी ऑब्जेक्ट के मेटाक्लास तक पहुंचने देता है - जिसे "सिंगलटन क्लास" या "ईजेनक्लास" भी कहा जाता है। मैं भविष्य की पोस्ट में मेटाक्लास को और अधिक गहराई से कवर करने की योजना बना रहा हूं। लेकिन अभी के लिए, आपको केवल यह जानने की जरूरत है कि मेटाक्लास वह जगह है जहां रूबी उन तरीकों को संग्रहीत करती है जो किसी विशिष्ट वस्तु के लिए अद्वितीय हैं।

यदि आप self . को एक्सेस करते हैं class << foo . के अंदर से ब्लॉक, आपको मेटाक्लास मिलता है।

class << "test"
  puts self.inspect
end

# => #<Class:#<String:0x007f8de283bd88>

किसी भी कक्षा के बाहर

यदि आप किसी भी वर्ग के बाहर कोड चला रहे हैं, तब भी रूबी self . प्रदान करता है . यह "मुख्य" की ओर इशारा करता है, जो Object . का एक उदाहरण है :

puts self.inspect # => main

  1. रूबी में इंसर्शन सॉर्ट को समझना

    नोट:रूबी के साथ विभिन्न सॉर्टिंग एल्गोरिदम को लागू करने पर विचार करने वाली श्रृंखला में यह भाग 4 है। भाग 1 ने बबल सॉर्ट की खोज की, भाग 2 ने चयन प्रकार की खोज की, और भाग 3 ने मर्ज सॉर्ट की खोज की। जैसा कि हम डेटा सॉर्ट करने के लिए विभिन्न तरीकों का पता लगाना जारी रखते हैं, हम इंसर्शन सॉर्ट की ओर रु

  1. रूबी में डुप बनाम क्लोन:अंतर को समझना

    क्या आप जानते हैं कि आप रूबी में किसी वस्तु की प्रतिलिपि बना सकते हैं? इतना ही नहीं, ऐसा करने के दो अलग-अलग तरीके हैं! ये विधियां हैं : dup clone हम एक पल में मतभेदों का पता लगाएंगे, लेकिन पहले… आप किसी वस्तु का क्लोन क्यों बनाना चाहते हैं ? रूबी में कई वस्तुएं परिवर्तनशील हैं, आप उन्हें बदल

  1. रूबी में डेकोरेटर डिजाइन पैटर्न

    डेकोरेटर डिजाइन पैटर्न क्या है? और आप अपने रूबी प्रोजेक्ट्स में इस पैटर्न का उपयोग कैसे कर सकते हैं? डेकोरेटर डिज़ाइन पैटर्न नई क्षमताओं . जोड़कर किसी ऑब्जेक्ट को बेहतर बनाने में आपकी सहायता करता है इसमें बिना कक्षा बदले। आइए एक उदाहरण देखें! लॉगिंग और प्रदर्शन इस उदाहरण में हम रेस्ट-क्लाइंट जैस