2015-10-25 5 views
6

मैं 4.class_methods चिंताओं में क्या करता है?

मैं कुछ लेख पढ़ने, कहने के लिए अगर हम मॉड्यूल ClassMethods का उपयोग कर वर्ग तरीकों शामिल करना चाहते हैं जो रेल में चिंताओं का उपयोग कुछ कोड पढ़ रहा हूँ, लेकिन मैं कोड की तरह कुछ का उपयोग करना पढ़ें:

class_methods do 
    def **** 
    end 
end 

उत्तर

4

यह सुविधा के लिए है। module ClassMethods शुद्ध रूबी है, लेकिन class_methods सुविधा के लिए ActiveSupport::Concern में परिभाषित किया गया है। यदि आप एक स्रोत कोड को देखें, तो आपको लगता है कि class_methods बिल्कुल वही बात

# activesupport/lib/concern.rb 
    def class_methods(&class_methods_module_definition) 
    mod = const_defined?(:ClassMethods, false) ? 
     const_get(:ClassMethods) : 
     const_set(:ClassMethods, Module.new) 

    mod.module_eval(&class_methods_module_definition) 
    end 
+1

मुझे नहीं लगता कि 'मॉड्यूल ClassMethods'" शुद्ध माणिक "ठीक है, हालांकि - माणिक भाषा स्वचालित रूप से कुछ एक उप मॉड्यूल' ClassMethods' कहा जाता है के साथ विशेष करना होगा में कुछ भी नहीं, वह भी 'ActiveSupport :: Concern' से आ रहा है। – jrochkind

+0

हां, रुबी स्वयं क्लासमेड के साथ कुछ भी नहीं करती है, लेकिन यह ActiveSupport से नहीं आई है। शायद ऐतिहासिक कारणों से लोग इस मॉड्यूल नाम का उपयोग करते हैं, मुझे नहीं पता। लेकिन यह अभी भी शुद्ध रूबी है। जैसा कि आप चाहते हैं, आप इस मॉड्यूल को नाम दे सकते हैं http://yehudakatz.com/2009/11/12/better-ruby-idioms/ –

+0

आप गलत हैं, ActiveSupport :: Concern वास्तव में एक उप-मॉड्यूल के साथ विशेष कुछ विशेष रूप से ' क्लासमेथ्स ', यह वही करता है जो आप इसके साथ करेंगे। https://github.com/rails/rails/blob/d06e42518a4fdd1732f1d75a43c69071bcd79245/activesupport/lib/active_support/concern.rb#L119 और https://github.com/rails/rails/blob/d06e42518a4fdd1732f1d75a43c69071bcd79245/activesupport/lib/active_support/ concern.rb # L135-L137 – jrochkind

0

class_methods चिंता का विषय द्वारा इस्तेमाल किया मॉडल के लिए वर्ग के तरीकों को जोड़ने के लिए प्रयोग किया जाता है करता मिल जाएगा।

एक ठेठ मॉड्यूल इस तरह दिखता है:

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

    module ClassMethods 
    ... 
    end 
end 

ActiveSupport::Concern का उपयोग करके ऊपर मॉड्यूल के बजाय के रूप में लिखा जा सकता है:,

require 'active_support/concern' 

module M 
    extend ActiveSupport::Concern 

    class_methods do 
    ... 
    end 
end 

Oleg Antonyan pointed out के रूप में स्रोत कोड से, हम जानते हैं कि यह क्या हो रहा है हुड के नीचे ClassMethods मॉड्यूल का उपयोग करने के लिए।

संदर्भ: http://api.rubyonrails.org/classes/ActiveSupport/Concern.html

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