Ruby on rails 为什么InstanceMethods模块被弃用?

Ruby on rails 为什么InstanceMethods模块被弃用?,ruby-on-rails,ruby-on-rails-3,activesupport,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3,Activesupport,Ruby On Rails 3.2,我爱你 它可以很容易地向类添加功能,语法也很好 无论如何,在Rails3.2中,InstanceMethods模块已经被弃用。如果我理解正确,我们应该在included块中定义我们的方法(实际上它就在模块的主体中): 我只是想知道是否有人知道他们为什么决定这么做?让我们看看您首先链接的示例 module TagLib extend ActiveSupport::Concern module ClassMethods def find_by_tags() # ...

我爱你

它可以很容易地向类添加功能,语法也很好

无论如何,在Rails3.2中,InstanceMethods模块已经被弃用。如果我理解正确,我们应该在
included
块中定义我们的方法(实际上它就在模块的主体中):


我只是想知道是否有人知道他们为什么决定这么做?

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

module TagLib
  extend ActiveSupport::Concern

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

  module InstanceMethods
    def tags()
      # ...
    end
  end 
end
当您将TagLib作为关注点包含到类中时,会自动使用ClassMethods模块和includes 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

好的,这是有道理的。但是现在我想知道为什么他们一开始就做出了这个选择。。。他们包含InstanceMethods模块的方式与我只做
包含TagLib
时包含模块的普通实例方法的方式是否没有区别?我不确定,但我认为这只是花了一些时间才实现。是的,我想这是他们看到该功能并说“WTF!我们为什么要这样做?”。将方法放在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