2010-11-13 12 views
13

मैं एक विरासत रूबी वर्ग को कक्षा वर्ग के माध्यम से अपने वर्ग के नाम को 'जान' के लिए चाहता हूं।रुबी में कक्षा नाम 'जानने' के लिए कक्षा विधि?

class Parent 
    def self.whoami 
    ?? 
    end 
end 

class Child < Parent 
    #No code should be needed. 
end 

तो मैं फोन करने के लिए सक्षम होना चाहिए:: यह सबसे अच्छा एक काल्पनिक उदाहरण के रूप में रेखांकित किया गया है

Parent.whomai 

और उम्मीद "पिता" की वापसी मैं तो कॉल करने के लिए सक्षम होना चाहिए:

Child.whoami 

और "चाइल्ड" की वापसी की उम्मीद है मुझे लगता है कि पारंपरिक भाषाओं में यह संभव नहीं हो सकता है। लेकिन रुबी के मेटाप्रोग्रामिंग मॉडल ने मुझे पहले आश्चर्यचकित कर दिया है। कोई विचार? अग्रिम में धन्यवाद।

उत्तर

20

A वर्ग विधि एक तरीका है, जहां कक्षा रिसीवर है, इसलिए वस्तु जिस पर विधि शुरू हो जाती है बस self का मूल्य का निरीक्षण (आप यहां यही प्रयास किए जाने की क्या दिखाई देते हैं) मिल रहा है।

class Parent 
    def self.whoami 
    self 
    end 
end 

class Child < Parent 
end 

puts Parent.whoami #=> Parent 
puts Child.whoami #=> Child 
+0

यह रास्ता बहुत आसान लग रहा था। धन्यवाद। –

+0

['मॉड्यूल # नाम'] (http://Ruby-Doc.Org/ruby-1.9/classes/Module.html#M000913) और डबल' डाल 'क्यों गलत है? –

+1

कोई तरीका नहीं है जो स्वयं को लौटाता है, ऑब्जेक्ट का सीधे उपयोग करें: 'माता-पिता रखता है'। पुट कक्षा के स्ट्रिंग नाम प्राप्त करने के लिए दृश्यों के पीछे Parent.to_s को कॉल कर रहा है। –

2

क्या Parent.class आपको बताएगा?

class Parent 
    def self.whoami 
    self.to_s 
    end 
end 

class Child < Parent 
end 

> Parent.whoami 
=> "Parent" 
> Child.whoami 
=> "Child" 
+0

तो इसकी एक वर्ग विधि, 'self' वर्ग –

+2

क्या साथ [' मॉड्यूल # name'] (http://Ruby-Doc.Org/ruby गलत है वापस आ जाएगी -1.9/वर्गों/Module.html # M000913)? –

+0

@ जोर्ग मैं मान रहा था कि वह कक्षा-विधि की तुलना में थोड़ा अधिक जटिल कर रहा था जिसने नाम वापस कर दिया, लेकिन आप सही हैं कि 'मॉड्यूल # नाम' ऐसा करने का सही तरीका है। –

15

एक वर्ग का नाम प्राप्त करने के लिए विधि (मॉड्यूल, वास्तव में) बस Module#name है। अपने खुद के लिखने के लिए कोई ज़रूरत नहीं है:

Parent.name # => 'Parent' 
Child.name # => 'Child' 

हालांकि, रूबी में, वहाँ वास्तव में एक "वर्ग के नाम" के रूप में ऐसी कोई बात नहीं के रूप में वहाँ कुछ अन्य भाषाओं में है। रूबी में, एक वर्ग बस किसी ऑब्जेक्ट की तरह एक ऑब्जेक्ट होता है जो किसी अन्य चर के समान चर को सौंप दिया जाता है।

सभी Module#name विधि सिस्टम में सभी स्थिरांक के माध्यम से लूप है और जांच करें कि मॉड्यूल को इनमें से किसी एक को सौंपा गया है, और उस निरंतर नाम या nil को वापस लौटाएं यदि उसे कोई नहीं मिल रहा है।

तो, किसी भी अन्य वस्तु की तरह, कक्षा का "नाम" वास्तव में कुछ भी नहीं है लेकिन आप इसका उपयोग करने के लिए जो भी चर उपयोग करते हैं।

उदाहरण:

foo = Class.new 
foo.name # => nil 

अब, वर्ग के "नाम" foo है। हालांकि, Module#namenil देता है, क्योंकि foo स्थिर नहीं है।

bar = foo 
bar.name # => nil 

अब, वर्ग के "नाम" दोनोंfoo और bar, लेकिन Module#name स्पष्ट रूप से अभी भी nil देता है।

BAZ = foo 
foo.name # => 'BAZ' 

अब, के बाद से वर्ग एक निरंतर करने के लिए आवंटित किया गया है, कि निरंतर का नाम उस वर्ग का नाम है & hellip पर विचार किया जाएगा;

BAZ = nil 
foo.name # => 'BAZ' 

और नरकिप; निरंतर कुछ अलग और नरक को सौंपा गया है के बाद भी;

QUX = foo 
QUX.name # => 'BAZ' 

और नरकिप; कक्षा के बाद भी एक अलग निरंतर को सौंपा गया है।

Module#to_sModule#name का उपयोग करता है अगर यह nil नहीं है, इसलिए, एक वर्ग के नाम पर मुद्रित करने के लिए, तो आप बस

puts Parent 

करना वास्तव में पूरी तरह से अन्य उत्तर में सभी जटिल फुलाना के लिए आवश्यकता नहीं है।

1

आप वर्ग मान लीजिए:

class ABC 
def self.some_method 
    self.name #it will return 'ABC' 
    self.name.constantize #it will return ABC 
end 
end 
संबंधित मुद्दे