17

ActiveSupport::Concern'u seviyorum.InstanceMethods modülü neden kullanımdan kaldırıldı?

Derslerinize güzel bir sözdizimi ekleyerek işlevsellik eklemenizi kolaylaştırır.

Her durumda, Rails 3.2'de, InstanceMethods modülü kullanımdan kaldırılmıştır.

# edit: don't do this! The method definition should just be in the body of the module 
included do 
    def my_method; end 
end 

onlar yapmaya karar neden bilse bilse diye merak ettim: Eğer doğru anladıysam, sadece included bloğun (aslında sadece modülün vücutta var) bizim yöntemlerini tanımlamak gerekir?

cevap

26

Önce bağlandığınız örneğe bakalım.

module TagLib 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def find_by_tags() 
     # ... 
    end 
    end 

    module InstanceMethods 
    def tags() 
     # ... 
    end 
    end 
end 

Endişe otomatik classmethods modülü ile sınıfını genişleten ve InstanceMethods modülünü içeren GİBİ size sınıfa TagLib dahil

.

class Foo 
    include TagLib 
    # is roughly the same as 
    include TagLib::InstanceMethods 
    extend TagLib::ClassMethods 
end 

Ama bunu içinde tanımlanmış yöntemler sınıfına örnek yöntemi olarak zaten mevcuttur yüzden zaten TagLib modülü kendisi dahil fark olabilir. Neden ayrı bir InstanceMethods modülüne sahip olmak istiyorsunuz?

module TagLib 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def find_by_tags() 
     # ... 
    end 
    end 

    def tags() 
    # ... 
    end 
end 

class Foo 
    include TagLib 
    # does only `extend TagLib::ClassMethods` for you 
end 
+0

Tamam, mantıklı. Ama şimdi neden bu seçimi ilk etapta yaptıklarını merak ediyorum ... InstanceMethods modülünü nasıl dahil ettikleri ile sadece TagLib 'i içerdiğimde modülün normal örnek yöntemlerini nasıl dahil ettikleri arasında bir fark yok mu? – Robin

+0

Sadece tutarlılık için miydi? – Robin

+0

Emin değilim, ama bunun farkına varmanın biraz zaman aldığını düşünüyorum. –

İlgili konular