2011-04-01 11 views
13
class Foo 

    def self.one; 1 end 

    class << self 
    def two; 2 end 
    end 

end 
puts Foo.singleton_methods.inspect # => ["two", "one"] 

मुझे उपर्युक्त तरीकों से बताया गया है "एक" और "दो" अवधारणात्मक रूप से अलग हैं लेकिन मुझे नहीं पता कि कैसे। वे दोनों सिंगलटन विधियां हैं - अवधारणा और एप्लिकेशन में क्या अंतर है?रूबी में self.method और कक्षा के भीतर एक विधि के बीच क्या अंतर है << स्वयं

+1

+1। 'Module_function' के बारे में क्या? मुझे इससे भी अंतर जानने में दिलचस्पी है। – sawa

उत्तर

7

आवेदन में, कोई अंतर नहीं है। अवधारणा में, अंतर सूक्ष्म है, लेकिन पहले मामले में, आप वर्तमान संदर्भ में परिचालन कर रहे हैं, और किसी अन्य वर्ग के उदाहरण (वास्तव में, अपने इगेंक्लास में एक उदाहरण विधि) पर एक विधि को परिभाषित कर रहे हैं, जबकि दूसरे मामले में, आप प्रवेश कर रहे हैं अन्य वर्ग उदाहरण के मेटाक्लास ("Eigenclass") का संदर्भ, और फिर एक आवृत्ति विधि को परिभाषित करना।

संपादित करें:

मैं जोड़ने चाहिए कि कुछ मामलों में class << self चुनने के लिए कारण हैं ...

  1. क्लीनर वाक्य रचना जब कुछ वर्ग तरीकों की तुलना में अधिक परिभाषित करने।
  2. आप def my_method ... के अलावा Eigenclass संदर्भ में अन्य प्रकार के कोड निष्पादित कर सकते हैं। उदाहरण के लिए, आप कोड के उस ब्लॉक में attr_accessor :some_attribute कह सकते हैं।
4

मैं आपको "मेटाप्रोग्रामिंग रूबी" पढ़ने के लिए दृढ़ता से अनुशंसा करता हूं। यह पुस्तक रूबी के ऑब्जेक्ट मॉडल के बारे में बताती है, जिसमें सिंगलटन विधि और सिंगलटन क्लास भी शामिल है।

http://pragprog.com/titles/ppmetr/metaprogramming-ruby

यह लेख भी एक ही विषय बताते हैं।

http://www.contextualdevelopment.com/articles/2008/ruby-singleton

+1

मैं मेटाप्रोग्रामिंग रूबी चेकआउट करूंगा। – djburdick

+0

मुझे वास्तव में आपके द्वारा भेजे गए लिंक से मेरा कोड स्निपेट मिला, क्योंकि मैं अभी भी उस लेख के बाद उलझन में था। उद्धरण "हालांकि कुछ ऑब्जेक्ट उन्मुख भाषाओं में कक्षा संरचनाएं होती हैं जो दोनों उदाहरण विधियों और वर्ग विधियों (कभी-कभी स्थैतिक विधियों कहा जाता है) का समर्थन करती हैं, रूबी केवल उदाहरण विधियों का समर्थन करती है। यदि रूबी केवल उदाहरण विधियों का समर्थन करती है, तो उन सभी क्लास विधियों को आप कहां बना रहे हैं ऊपर? क्यों, सिंगलटन कक्षा पाठ्यक्रम। " मेरे लिए यह कह रहा है कि self.method समान है - यानी वे सभी सिंगलेट हैं – djburdick

+0

रूबी केवल उदाहरण विधियों का समर्थन करता है, लेकिन कक्षा कक्षा वर्ग का भी एक उदाहरण है। जब आप किसी उदाहरण में क्लास इंस्टेंस (क्लास इंस्टेंस समेत, एक क्लास समेत) जोड़ते हैं, तो आप वास्तव में इंस्टेंस की क्लास को जो भी था, उसके नए अज्ञात सबक्लास में बदल रहे हैं, और उसके बाद उस सबक्लास में एक नया इंस्टेंस विधि जोड़ रहे हैं। उस अनाम उपclass को अक्सर Eigenclass के रूप में जाना जाता है। –

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