2012-12-04 11 views

उत्तर

48

अन्य भाषाओं के विपरीत, रूबी के पास कोई वर्ग विधि नहीं है, लेकिन इसमें एक विशेष वस्तु से जुड़ी सिंगलटन विधियां हैं।

cat = String.new("cat") 
def cat.speak 
    'miaow' 
end 
cat.speak #=> "miaow" 
cat.singleton_methods #=> ["speak"] 

def cat.speak एक सिंगलटन विधि वस्तु बिल्ली से जुड़ी बनाया गया है।

जब आप class A लिखते हैं, यह A = Class.new के बराबर है:

A = Class.new 
def A.speak 
    "I'm class A" 
end 
A.speak #=> "I'm class A" 
A.singleton_methods #=> ["speak"] 

def A.speak एक सिंगलटन विधि वस्तु ए से जुड़ी हम यह वर्ग ए के एक वर्ग विधि कॉल करने का उपयोग पैदा कर दी है

जब आप

class A 
    def self.c_method 
     'in A#c_method' 
    end 
end 

लिखते हैं तो आप कक्षा (*) का एक उदाहरण बनाते हैं।कक्षा परिभाषा के अंदर, रूबी कक्षा के इस नए उदाहरण को स्वयं सेट करता है, जिसे निरंतर ए को सौंपा गया है। इस प्रकार def self.c_methoddef cat.speak के समतुल्य है, जिसका अर्थ यह है कि आप ऑब्जेक्ट से जुड़े सिंगलटन विधि को परिभाषित करते हैं, जो वर्तमान में है कक्षा ए

अब कक्षा ए में दो सिंगलटन विधियां हैं, जिन्हें हम आमतौर पर कक्षा विधियों को कॉल करते हैं।

A.singleton_methods 
=> ["c_method", "speak"] 

(*) तकनीकी रूप से, इस मामले में जहां एक पहले से ही एक = Class.new द्वारा बनाई गई है में, class A मौजूदा वर्ग खोल देता है। यही कारण है कि अंत में हमारे पास दो सिंगलटन विधियां हैं। लेकिन सामान्य स्थिति में जहां यह कक्षा की पहली परिभाषा है, इसका मतलब कक्षा है। नया।

+6

के लिए धन्यवाद यह सही उत्तर है। यह सच है कि अनुभवी रूबिस्ट कभी-कभी "क्लास ऑब्जेक्ट" शब्द का उपयोग "क्लास ऑब्जेक्ट के सिंगलटन क्लास के उदाहरण विधि" के लिए करते हैं, लेकिन वे पूरी समझ में उस शॉर्टंड का उपयोग करते हैं कि * क्लास विधि * जैसी कोई चीज़ नहीं है माणिक। (वास्तव में, "सिंगलटन विधि" जैसी कोई चीज़ नहीं है: सिंगलटन विधियां केवल नियमित विधियां होती हैं जिन्हें किसी ऑब्जेक्ट के सिंगलटन क्लास में परिभाषित किया जाता है।) ओपी, हालांकि, स्पष्ट रूप से * अनुभवी रूबीस्ट नहीं है , इसलिए उसे शॉर्टेंड के साथ भ्रमित करना एक अच्छा विचार नहीं है। थम्स अप! –

7

एक विधि घोषित करते समय, घोषणा के self घोषित वर्ग/मॉड्यूल है, इसलिए प्रभावी ढंग से आप कक्षा विधि को परिभाषित कर रहे हैं। यह जावा में static विधि की तरह है। आप उदाहरण के बजाए कक्षा पर विधि को कॉल करेंगे: MyClass.method

Here आप कक्षा और उदाहरण विधियों पर कुछ और विवरण पा सकते हैं।

संपादित करें: एक ओर जहां self कीवर्ड जावा में this कीवर्ड के लिए समान है, वर्ग विधि घोषणा के लिए self का उपयोग कर के प्रभाव को जावा में static कीवर्ड का उपयोग करने के प्रभाव के समान हैं। समानता यह है कि जावा में स्थैतिक तरीकों, जैसे रूबी में कक्षा विधियों को कक्षा के उदाहरण के बजाय क्लास ऑब्जेक्ट का उपयोग करके एक्सेस किया जाता है।

कृपया ध्यान दें कि static गतिशील के विपरीत के लिए खड़ा नहीं है। इस कीवर्ड के नाम की पसंद संदिग्ध है (शायद सी से विरासत में मिली) और इसे perClass कहा जाना चाहिए या अर्थ को बेहतर ढंग से प्रतिबिंबित करने के समान होना चाहिए। तकनीकी अर्थ यह है कि सभी static सदस्य प्रत्येक क्लासलोडर के लिए केवल एक बार मौजूद होते हैं।

+1

यह * स्थिर 'की तरह * कुछ भी नहीं है। विशेष रूप से, वे विधियां गतिशील हैं, स्थैतिक नहीं हैं। –

+3

@ जोर्ग डमिटाग: यह जावा की 'स्थिर' की तरह कम से कम एक अर्थ में है - यह आवृत्ति स्तर की बजाय कक्षा स्तर पर लागू होता है। –

+3

@ जोर्ग डमिटाग - <कुछ भी नहीं> अलग समानता वाले कुछ के लिए एक मजबूत शब्द है (और निश्चित रूप से मतभेद हैं)। मेरे दृष्टिकोण को स्पष्ट करने के लिए कुछ जानकारी जोड़ दी है। – kostja

29

रूबी स्वयं जावा में this के समान कुछ है, लेकिन जब कक्षाओं में यह शब्द static जावा में अधिक होता है। एक छोटी उदाहरण:

class A 
    # class method 
    def self.c_method 
    true 
    end 
    # instance method 
    def i_method 
    true 
    end 
end 

A.c_method #=> true 
A.i_method #=> failure 
A.new.i_method #=> true 
A.new.c_method #=> failure 

अद्यतन: माणिक में जावा और वर्ग के तरीकों में स्थिर तरीकों

जावा में स्टेटिक तरीकों दो अलग-अलग विशेषताएं हैं के बीच अंतर है कि उन्हें उदाहरण के तरीकों से अलग बनाता है: क) वे स्थैतिक हैं, बी) वे एक उदाहरण से जुड़े नहीं हैं। (IOW: वे वास्तव में विधियों की तरह नहीं हैं, वे केवल प्रक्रियाएं हैं।) रूबी में, सभी विधियां गतिशील होती हैं, और सभी विधियां एक उदाहरण से जुड़ी होती हैं। वास्तव में, जावा के विपरीत जहां तीन अलग-अलग प्रकार के "विधियों" (उदाहरण विधियों, स्थिर विधियों और रचनाकारों) हैं, रूबी में केवल एक ही विधि है: उदाहरण विधियां। तो, नहीं: जावा में स्थिर तरीके रूबी में विधियों के विपरीत पूरी तरह से हैं। - जोर्ग डब्ल्यू मिट्टाग 1 घंटा पहले

+0

यह * स्थिर नहीं है * बिल्कुल 'स्थिर 'की तरह। विशेष रूप से, वे विधियां गतिशील हैं, स्थैतिक नहीं हैं। –

+0

यदि आप def 'self.method के साथ रूबी में 'कक्षा # विधि' को परिभाषित करते हैं ... 'इसकी तरह' क्लास जावा क्लास की तरह; सार्वजनिक स्थैतिक शून्य विधि ... जावा में – krichard

+2

जावा में स्थिर विधियों में दो विशिष्ट विशेषताएं हैं जो उन्हें उदाहरण विधियों से अलग बनाती हैं: ए) वे स्थैतिक हैं, बी) वे एक उदाहरण से जुड़े नहीं हैं। (IOW: वे वास्तव में विधियों * की तरह नहीं हैं *, वे केवल प्रक्रियाएं हैं।) रूबी में, * सभी * विधियां गतिशील हैं, और * सभी * विधियां एक उदाहरण से जुड़ी हैं। वास्तव में, जावा के विपरीत जहां तीन अलग-अलग प्रकार के "विधियों" (उदाहरण विधियों, स्थिर विधियों और रचनाकारों) हैं, रूबी में केवल * एक * प्रकार की विधि है: उदाहरण विधियां। तो, नहीं: जावा में स्थिर तरीके रूबी में विधियों के विपरीत पूरी तरह से हैं। –

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