2012-11-09 17 views
10

मैं रूबी में सिंगलेट्स के बारे में पढ़ रहा था। मुझे पहले कभी उनका उपयोग करने की ज़रूरत नहीं थी, लेकिन मुझे उत्सुकता मिली और उन्हें देखने का फैसला किया, यह देखने के लिए कि क्या मुझे अतीत में उनका इस्तेमाल करना चाहिए था, या शायद मैं भविष्य में उनका उपयोग कर सकता हूं अगर मुझे पता था कि क्या उनका उपयोग किया जाता है।रुबी में सिंगलटन कक्षाओं का उपयोग करना कब बुद्धिमान है?

केवल बार मैं के बारे में सोच सकते हैं इस का उपयोग करने के लिए है:

  • ? जब मुझे एक विशेष वस्तु की आवश्यकता होती है। उदाहरण: "स्मार्ट" Hash ऑब्जेक्ट, जो कि कुछ अतिरिक्त क्विर्क के साथ एक सामान्य रूबी हैश की तरह कार्य करता है।
  • जब मैं इसे बनाना चाहता हूं तो कक्षा का केवल एक उदाहरण मौजूद हो सकता है।

हालांकि, मुझे सच में यकीन नहीं है कि मुझे उपरोक्त में से किसी एक की आवश्यकता है।

+0

क्या आप सिंगलटन क्लास के बारे में बात कर रहे हैं कि प्रत्येक ऑब्जेक्ट में है, या आप सिंगलटन लाइब्रेरी के बारे में बात कर रहे हैं जो आपको कक्षा को केवल एक उदाहरण के साथ एक छद्म-ग्लोबल घोषित करने देता है? – Phrogz

+0

@Phrogz "सिंगलटन लाइब्रेरी के बारे में जो आपको एक छद्म-ग्लोबल क्लास को केवल एक उदाहरण के साथ घोषित करने देता है?" हालांकि, मुझे नहीं पता था कि यह एक पुस्तकालय है? मैंने सोचा कि यह एक अंतर्निहित रूबी सुविधा है। – omninonsense

+1

मैं [इस मॉड्यूल] का जिक्र कर रहा हूं (http://ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html) जो कि मानक लाइब्रेरी का हिस्सा है, ['singleton_class '] (http://ruby-doc.org/core-1.9.3/Object.html#method-i-singleton_class) और संबंधित [विधियों] (http://ruby-doc.org/core-1.9.3 /Object.html#method-i-singleton_methods) (जो रूबी कोर का हिस्सा है)। – Phrogz

उत्तर

10

ध्यान दें कि सिंगलटन मॉड्यूल में एक वर्ग मिश्रण एक वर्ग या मॉड्यूल के बराबर है जो 'वर्ग' विधियों के साथ है और या तो गारंटीकृत प्रारंभिक कॉल या इनलाइन प्रारंभिकता है। सिंगलटन के इस प्रयोग की तुलना करें:

require 'singleton' 
class Bar 
    include Singleton 
    attr_reader :jam 
    def initialize 
    @jam = 42 
    end 
    def double 
    @jam *= 2 
    end 
end 

b1 = Bar.instance 
b1.double 
b2 = Bar.instance 
b2.double 
p b1.jam   #=> 168 

यह कोई-जादू मॉड्यूल के साथ:

module Foo 
    @jam = 42 
    def self.double 
    @jam *= 2 
    end 
    def self.jam 
    @jam 
    end 
end 

Foo.double 
Foo.double 
p Foo.jam   #=> 168 

दोनों ही मामलों आप एक ही वैश्विक उद्देश्य यह है कि राज्य का कहना है में। (क्योंकि कक्षाओं और मॉड्यूल समेत वैश्विक क्षेत्र में आप जो भी स्थिर बनाते हैं, वह वैश्विक वस्तु है।)

एकमात्र कार्यात्मक अंतर यह है कि Singleton के साथ आप पहली बार ऑब्जेक्ट के प्रारंभ में देरी करते हैं जब तक आप इसके लिए नहीं पूछते ।

इसलिए, यदि आपके पास कभी भी कक्षा या मॉड्यूल पर 'कक्षा' विधियां हैं और आप उन ऑब्जेक्ट्स की स्थिति को बदलने के लिए उपयोग करते हैं (उदाहरण के लिए एक वर्ग जो सभी उप-वर्गों का उत्तराधिकारी है, तो आप अनिवार्य रूप से एक सिंगलटन का उपयोग कर रहे हैं) ।

4

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

5

आप रूबी में हर समय सिंगलटन कक्षाओं का उपयोग करते हैं। वास्तव में, प्रत्येक ऑब्जेक्ट में सिंगलटन क्लास होता है। (नोट: प्रदर्शन कारणों से, सिंगलटन कक्षाएं वास्तव में केवल तब बनाई जाती हैं जब आप उन्हें पहली बार एक्सेस करते हैं, लेकिन यह एक प्रदर्शन अनुकूलन है। अर्थात्, हर बार जब आप सिंगलटन क्लास को देखने का प्रयास करते हैं, तो यह वहां होगा।)

तो कहा जाता है "वर्ग विधियों", उदाहरण के लिए, वास्तव में रूबी में मौजूद नहीं है। वे क्लास ऑब्जेक्ट की सिंगलटन कक्षा के नियमित उदाहरण विधियां हैं। (इसके बजाय "कक्षा विधि" कहना इतना आसान है।)

हर बार जब आप def foo.bar वाक्यविन्यास के साथ एक विधि को परिभाषित करते हैं, तो आप foo के सिंगलटन वर्ग में एक विधि जोड़ रहे हैं।

+0

मुझे इसके बारे में पता है, लेकिन मैं सिर्फ उस समय के बारे में सोच नहीं सकता जब मुझे किसी ऑब्जेक्ट को किसी विधि को परिभाषित करने की आवश्यकता होती है, इसे कक्षा में निर्दिष्ट करने के अलावा, शायद एक विशिष्ट उदाहरण – omninonsense

+3

कभी-कभी, वहां होते हैं चीजें जो वास्तव में केवल शुद्ध "कार्य" हैं, जो किसी वस्तु से संबंधित नहीं हैं, और उनके पास कोई राज्य नहीं है। लेकिन आप अभी भी उन्हें एक नामस्थान में रखना चाहते हैं। उदाहरण के लिए, 'मठ' मॉड्यूल। –

+0

आह, मैंने वास्तव में इसका उपयोग किया था, अब मैं इसके बारे में सोचता हूं। खैर, मैं अब मूर्खतापूर्ण महसूस करता हूँ। : उदास: – omninonsense

1

आपका दूसरा बुलेट बिंदु बिल्कुल बिंदु पर है। एक सिंगलटन वर्ग के बारे में पूरी तरह से स्थैतिक वस्तु के रूप में सोचें। रूबी में बूलियन और नल ऑब्जेक्ट्स उदाहरण हैं।

+1

दरअसल, 'सत्य', 'झूठी' और 'शून्य 'नियमित कक्षाओं (' ट्रूक्लास ',' गलत वर्ग 'और' नील क्लास ') के सभी नियमित उदाहरण हैं। वे * सिंगलटन कक्षाओं के साथ परिभाषित किए जा सकते थे (और यह भी एक बेहतर डिजाइन हो सकता है), लेकिन किसी कारण से वे नहीं हैं। –

संबंधित मुद्दे