2010-08-15 8 views
18
class C 
end 

var = "I am a local var outside" 

C.class_eval do 
    def self.a_class_method 
    puts var 
    end 
end 

मुझे पता है, यह सही नहीं है, क्योंकि def ने एक नया दायरा बनाया है। मुझे यह भी पता है कि define_method का उपयोग एक नया स्कोप बनाने के बिना एक इंस्टेंस विधि बना सकता है, लेकिन मेरा बिंदु यह है कि क्लास विधि को परिभाषित करने का तरीका है।एक क्लास विधि को गतिशील रूप से परिभाषित करने के लिए जो स्थानीय चर के बाहर संदर्भित होगा?

उत्तर

44

कक्षा विधियां वास्तव में रूबी में मौजूद नहीं हैं, वे कक्षा वस्तु के केवल सिंगलटन विधियां हैं। सिंगलटन विधियां वास्तव में मौजूद नहीं हैं, या तो, वे वस्तु के सिंगलटन वर्ग के साधारण उदाहरण विधियां हैं।

चूंकि आप पहले से ही जानते हैं कि उदाहरण विधियों को कैसे परिभाषित किया जाए (Module#define_method का उपयोग करके), आप पहले से ही जो कुछ जानना चाहते हैं उसे जानते हैं। तुम बस के बजाय CC की सिंगलटन वर्ग पर class_eval कॉल करने के लिए अपने आप की जरूरत है:

(class << C; self end).class_eval do 
    define_method(:a_class_method) do 
    puts var 
    end 
end 

रूबी के वर्तमान संस्करण है कि आसान बनाने के लिए एक singleton_class विधि है: के

C.singleton_class.class_eval do 
    define_method(:a_class_method) do 
    puts var 
    end 
end 

लेकिन वास्तव में, वर्तमान संस्करण रूबी भी Module#define_singleton_method है, इसलिए, इस विशेष मामले में, कि अनावश्यक है:

C.define_singleton_method(:a_class_method) do 
    puts var 
end 
+0

यू बहुत बहुत धन्यवाद! – Croplio

+0

ग्रेट उत्तर। क्या आप कक्षा विधियों मेटा प्रोग्रामिंग पर रूबी के दस्तावेज के लिंक साझा कर सकते हैं? धन्यवाद – mattgathu

+0

@mattgathu: रुबी में कोई कक्षा के तरीके नहीं हैं। केवल एक ही तरह की विधियां हैं: उदाहरण विधियां। –

0

आप इसे आसानी से कर सकते हैं

class << C 
    define_method(:a_class_method) do 
    # do something 
    end 
end