17

Amo il ActiveSupport::Concern.Perché il modulo InstanceMethods è stato deprecato?

Semplifica l'aggiunta di funzionalità alle classi, con una buona sintassi.

Ad ogni modo, in Rails 3.2, il modulo InstanceMethods è stato deprecato. Se ho capito bene, dobbiamo solo definire i nostri metodi nella included blocco (in realtà è solo nel corpo del modulo):

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

Mi stavo chiedendo se qualcuno conosce il motivo per cui hanno deciso di farlo?

risposta

26

Esaminiamo prima l'esempio collegato.

module TagLib 
    extend ActiveSupport::Concern 

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

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

Quando si include TagLib nella tua classe come la preoccupazione estende automaticamente la classe con il modulo ClassMethods e comprende il modulo InstanceMethods.

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

Ma, come si può notare stiamo già incluso modulo TagLib stesso modo i metodi definiti all'interno di esso sono già disponibili come metodi di istanza sulla classe. Perché dovresti avere un modulo InstanceMethods separato?

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

Ok, ha senso. Ma ora mi chiedo perché hanno fatto questa scelta, in primo luogo, quindi ... NON c'è differenza tra il modo in cui hanno incluso il modulo InstanceMethods e come sono inclusi i normali metodi di istanza del modulo quando faccio solo "includere TagLib"? – Robin

+0

Era solo per coerenza? – Robin

+0

Non ne sono sicuro, ma penso che ci sia voluto del tempo per rendersene conto. –