为什么不推荐使用InstanceMethods模块?

时间:2012-01-03 01:04:18

标签: ruby-on-rails ruby-on-rails-3 activesupport ruby-on-rails-3.2

我爱ActiveSupport::Concern

通过良好的语法,可以轻松地为类添加功能。

无论如何,在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 个答案:

答案 0 :(得分:27)

让我们看一下您首先链接的示例。

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