2009-12-13 13 views
12

मेरे पास इसके लिए निरंतर परिभाषित कक्षा है। मेरे पास एक वर्ग विधि परिभाषित है जो उस वर्ग निरंतर उपयोग करता है। यह ठीक काम करता है। एक उदाहरण:(रुबी में) मिश्रित श्रेणी के तरीकों को क्लास स्थिरांक तक पहुंचने की अनुमति देता है

#! /usr/bin/env ruby 

class NonInstantiableClass 
    Const = "hello, world!" 
    class << self 
     def shout_my_constant 
      puts Const.upcase 
      end 
     end 
    end 

NonInstantiableClass.shout_my_constant 

मेरे समस्या एक बाहरी मॉड्यूल के लिए इस वर्ग विधि बाहर ले जाने के लिए है, तो तरह के प्रयास में पैदा होती है:

#! /usr/bin/env ruby 

module CommonMethods 
    def shout_my_constant 
     puts Const.upcase 
     end 
    end 

class NonInstantiableClass 
    Const = "hello, world!" 
    class << self 
     include CommonMethods 
     end 
    end 

NonInstantiableClass.shout_my_constant 

रूबी, मॉड्यूल से एक निरंतर का अनुरोध के रूप में विधि की व्याख्या करने के बजाय कक्षा:

line 5:in `shout_my_constant': uninitialized constant CommonMethods::Const (NameError) 

तो, आप किस जादू की चाल को क्लास निरंतर कक्षा तक पहुंचने देते हैं? बहुत धन्यवाद।

#! /usr/bin/env ruby 

module CommonMethods 
    def shout_my_constant 
     puts self::Const.upcase 
    end 
end 

class NonInstantiableClass 
    Const = "hello, world!" 
    class << self 
     include CommonMethods 
    end 
end 

NonInstantiableClass.shout_my_constant 

HTH

उत्तर

14

यह काम करने लगता है। आपको इसके बजाय Module#const_get का उपयोग करना होगा: const_get(:Const)। विधि निष्पादित होने पर रनटाइम पर इसका मूल्यांकन किया जाता है। तो यह आपके वर्ग में होता है, न कि आपके मॉड्यूल में।

+0

अच्छा, यह चीजों को साफ़ करता है। मुझे अभी तक :: वाक्यविन्यास का अनुभव नहीं हुआ :)। – jameshfisher

+0

अभी पढ़ना बंद मत करो। जोहान्स प्रतिक्रिया के नीचे पढ़ें। – Sebastian

9

समस्या है, अगर आप सिर्फ Const बारे में यह मॉड्यूल निर्माण के समय पर मूल्यांकन किया जाता है:

+0

धन्यवाद! सफलता के बिना, वह तरीका जिस तरह से मैं खोज रहा था। – jameshfisher

12

शायद यह ध्यान देने योग्य है कि आपको मेटाक्लास में मॉड्यूल शामिल करने की आवश्यकता नहीं है।

class NonInstantiableClass 
    Const = "hello, world!" 
    class << self 
     include CommonMethods 
    end 
end 

रूबी extend कीवर्ड प्रभावी रूप से एक वर्ग है, उदा करने के लिए मॉड्यूल इंटरफ़ेस कहते हैं कि है

class NonInstantiableClass 
    Const = "hello, world!" 
    extend CommonMethods 
end 

तुम अब भी सुनिश्चित करने के लिए आप सही निरंतर self::Const या const_get का उपयोग कर संदर्भित कर रहे हैं की जरूरत है, लेकिन extend <module> वर्ग के लिए उन तरीकों को जोड़ने के लिए बेहतर तरीका है।

+0

फिर भी एक और सहायक टिप्पणी। मैंने एक सवाल पूछने से तीन चीजें सीखी हैं। – jameshfisher

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

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