2013-02-08 11 views
5

मेरे पास एक मॉड्यूल है जो लॉग पर लिखता है। प्रत्येक संदेश में मैं इस संदेश को लॉग करने वाले वर्ग का नाम रखना चाहता हूं।self.class.name एक मिश्रण-मॉड्यूल में

मॉड्यूल include या extend का उपयोग कर मिश्रित किया जा सकता है। मुझे प्रत्येक मामले में सही वर्ग के नाम रखने के लिए मेरे लॉग की आवश्यकता है।

आसुत कोड:

module M 
    def f 
    self.class.name 
    end 
end 

class C 
    extend M 
    include M 
end 

p C.f # => "Class" 
p C.new.f # => "C" 

जैसा कि आप देख, पहली कॉल गलत तरीके से "Class" प्रिंट करता है। मैं इसे "C" भी चाहता हूं।

इसे कैसे पूरा करें?

उत्तर

4

कोई ज़रूरत नहीं हुक का सहारा लेना, बस अपने व्यवहार को बदलने जब self एक Class/Module है:

module M 
    def f 
    self.is_a?(Module) ? name : self.class.name 
    end 
end 

class C 
    extend M 
    include M 
end 

C.f  #=> "C" 
C.new.f #=> "C" 
3

आप इसे ऐसा कर सकते हैं, यह नहीं पता कि एक बेहतर विधि मौजूद है या नहीं।

module M 
    def self.included(base) 
    base.extend ClassMethods 
    end 

    def f 
    self.class.name 
    end 

    module ClassMethods 
    def f 
     self.name 
    end 
    end 
end 

class C 
    include M 
end 
+0

यह सब पर काम नहीं करता है अगर आप ', m' का विस्तार हालांकि। –

+0

आपको विस्तार करने की ज़रूरत नहीं है। क्लास विधि विधि मॉड्यूल के अंदर रखे गए विधियों को आप जिस तरीके से बदलना चाहते हैं। :) – Kaeros

+0

क्या होगा यदि मैं सिर्फ विस्तार करना चाहता हूं, और इसमें शामिल नहीं हूं? तब मुझे किसी भी अच्छे कारण के लिए 'एम :: क्लासमेड्स का विस्तार' करना होगा। व्यक्तिगत रूप से, मैं वास्तव में पूरे विस्तार-पर-समावेश पैटर्न को वास्तव में नापसंद करता हूं। –

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

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