【问题标题】:Why has the InstanceMethods module been deprecated?为什么 InstanceMethods 模块已被弃用?
【发布时间】:2012-02-01 04:13:03
【问题描述】:

我喜欢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

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

【问题讨论】:

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


    【解决方案1】:

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

    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
    

    【讨论】:

    • 好的,有道理。但现在我想知道他们为什么首先做出这个选择......他们包含 InstanceMethods 模块的方式与我刚刚执行include TagLib 时包含模块的普通实例方法的方式之间没有区别吗?
    • 我不确定,但我认为只是花了一些时间才意识到这一点。
    • 是的,我认为这是他们查看该功能并说“WTF!我们为什么要这样做?”的时候之一。将方法放入 InstanceMethods 模块是多余的。所以不,旧方式和新方式之间没有区别,只是少了一种浮动。
    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    相关资源
    最近更新 更多