2015-10-25 29 views
6

ben biz modülü ClassMethods kullanarak sınıf yöntemleri dahil etmek istiyorsa, demek bazı makaleleri okumak 4.class_methods endişeler içinde ne yapıyor?

Rails endişeleri kullanan bazı kodları okuyorum ama kod gibi bir şey kullanılarak okunan:

class_methods do 
    def **** 
    end 
end 

cevap

4

Sadece kolaylık içindir. module ClassMethods, saf Ruby'dir, ancak class_methods, kolaylık sağlamak için ActiveSupport::Concern'da tanımlanmıştır. Bir kaynak kodu bakarsanız class_methods tam olarak aynı şey

# 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

Ben modül ClassMethods' tam olsa "saf yakut" dir 'düşünmüyorum - otomatik' ClassMethods' adında bir alt modülü ile özel bir şey yapacak yakut dilinde hiçbir şey çok o ActiveSupport :: Concern’ten geliyor. – jrochkind

+0

Evet, Ruby kendisi tarafından ClassMethods ile bir şey yapmaz, ancak ActiveSupport'tan gelmedi. Belki tarihi sebeplerden dolayı insanlar bu modül adını kullanırlar, bilmiyorum. Ama hala saf Ruby. Bu modülü istediğiniz gibi adlandırabilirsiniz. Http://yehudakatz.com/2009/11/12/better-ruby-idioms/ –

+0

Hatalısınız, ActiveSupport :: Endişe gerçekten özel olarak adlandırılan bir alt modül ile özel bir şey yapacak ClassMethods', onunla ne beklediğinizi yapar. https://github.com/rails/rails/blob/d06e42518a4fdd1732f1d75a43c69071bcd79245/activesupport/lib/active_support/concern.rb#L119 ve https://github.com/rails/rails/blob/d06e42518a4fdd1732f1d75a43c69071bcd79245/activesupport/lib/active_support/ regard.rb # L135-L137 – jrochkind

0

class_methods yapar endişe kullandığı modele sınıf yöntemleri eklemek için kullanılır olduğunu göreceksiniz.

Tipik bir modül şuna benzer:

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

    module ClassMethods 
    ... 
    end 
end 

ActiveSupport::Concern kullanarak yukarıdaki modül yerine olarak yazılmış olabilir: kaynak kodundan, Oleg Antonyan pointed out olarak

require 'active_support/concern' 

module M 
    extend ActiveSupport::Concern 

    class_methods do 
    ... 
    end 
end 

, biz gidiyor biliyorum Kaputun altında ClassMethods modülünü kullanmak.

Referans: http://api.rubyonrails.org/classes/ActiveSupport/Concern.html