2011-03-14 5 views
8

जब एक class << self परिभाषा के अंदर const_missing और अन्य वर्ग के तरीकों को परिभाषित करने के रूप में def self.foo सिंटैक्स का उपयोग करने के लिए विरोध कर रहा हूँ मैं बहुत रूबी के व्यवहार से उलझन में।गुम निरंतर और "const_missing" अंदर "वर्ग << स्व" परिभाषा

मैं इस तरह कुछ करने के लिए कोशिश कर रहा था:

class Foo 
    class << self 
    def foo 
     puts MISSING 
    end 

    def const_missing(name) 
     puts "#{name} missing" 
    end 
    end 
end 

Foo.foo 

मैं ज्यादातर वर्ग पद्धतियां निर्धारित करने के class << self सिंटैक्स का उपयोग करें। हालांकि, यह उम्मीद के रूप में काम नहीं किया था। const_missing कभी नहीं कहा जाता है। उपरोक्त परिणाम एक नाम त्रुटि में।

दोनों तरीकों को परिभाषित करना इस काम करता है की तरह के रूप में उम्मीद:

def self.foo 
    puts MISSING 
end 

def self.const_missing(name) 
    puts "#{name} missing" 
end 

मैंने सोचा था कि class << self वाक्य रचना वर्ग पद्धतियां निर्धारित करने के सिर्फ एक और तरीका है, लेकिन पूरी तरह def self.foo के बराबर है? मैंने ऊपर एमआरआई 1.8.7, 1.9.2 और जेआरबी 1.5.6 के साथ परीक्षण किया है। तो जाहिर है मैं यहाँ कुछ याद कर रहा हूँ?

किसी भी संकेत की सराहना की जाती है।

धन्यवाद, मार्टिन

उत्तर

12

class << self वर्ग पद्धतियां निर्धारित करने के लिए एक शॉर्टकट नहीं है। यह वाक्यविन्यास (मुझे सटीक नामकरण नहीं पता) किसी ऑब्जेक्ट से ईजिनक्लास खोलता है (आपके मामले में, एक वर्ग में)। इसके साथ आप ऑब्जेक्ट को विधियों को परिभाषित कर सकते हैं (उदाहरण विधियों नहीं)। लेकिन जब आप ईजेनक्लास में निरंतर कॉल करते हैं, तो आप कक्षा से नहीं, इगेंक्लास से लगातार कॉल कर रहे हैं। इस मामले में आप const_missing, दो कि ऐसा करने के लिए तरीके के लिए eigenclass पर एक वर्ग विधि को परिभाषित करने के लिए है:

class Test 
    class << self 
    def foo 
     p MISSING 
    end 

    # First way: (syntax sugar for the second way) 
    def self.const_missing(name) 
     name 
    end 

    # Second way: 
    class << self # eigenclass of the eigenclass of the class 
     def const_missing(name) 
     name 
     end 
    end 

    end 
end 

Test.foo #=> :MISSING 
+0

धन्यवाद एक बहुत, LBG। मुझे पता था कि 'वर्ग << स्वयं' एक वर्ग के eigenclass खोलता है। लेकिन चूंकि क्लास विधियां केवल इगेंक्लास के उदाहरण विधियां हैं, मैंने सोचा कि यह इस तरह से काम करेगा। हालांकि, यह पूरी तरह से समझ में आता है कि, eigenclass से लगातार संदर्भित एक वर्ग के रूप में संदर्भित निरंतर के समान नहीं है। कभी-कभी यह पूरी चीज मेरे सिर को स्पिन बनाती है :) – martido