Почему модуль InstanceMethods устарел? - PullRequest
17 голосов
/ 03 января 2012

Я люблю ActiveSupport :: Концерн .

Это позволяет легко добавлять функциональность в ваши классы с хорошим синтаксисом.

В любом случае, в Rails 3.2 модуль InstanceMethods устарел. Если я правильно понял, мы должны просто определить наши методы в блоке included (на самом деле это просто в теле модуля):

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

Мне просто интересно, кто-нибудь знает, почему они решили это сделать?

1 Ответ

27 голосов
/ 03 января 2012

Давайте рассмотрим пример, который вы сначала связали.

module TagLib
  extend ActiveSupport::Concern

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

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

Когда вы включаете TagLib в свой класс, AS Concern автоматически расширяет класс с помощью модуля ClassMethods и включает модуль InstanceMethods.

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

Но, как вы могли заметить, мы уже включили сам модуль TagLib, поэтому определенные в нем методы уже доступны как методы экземпляра класса.Почему вы хотите иметь отдельный модуль InstanceMethods?

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
...