为啥 InstanceMethods 模块已被弃用?

Posted

技术标签:

【中文标题】为啥 InstanceMethods 模块已被弃用?【英文标题】: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

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

【问题讨论】:

【参考方案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 模块是多余的。所以不,旧方式和新方式之间没有区别,只是少了一种浮动。

以上是关于为啥 InstanceMethods 模块已被弃用?的主要内容,如果未能解决你的问题,请参考以下文章

HttpEntity 现在在 Android 上已被弃用,还有啥替代方案?

GLSL——texture1D 已被弃用,改用啥?

PageRequest 构造函数已被弃用

@angular-cli 安装失败,请求被弃用@2.88.2:请求已被弃用(mac)

现在 Google 网络搜索 API 已被弃用,还都有哪些替代方案? [关闭]

解决Vscode提示bodyparser已被弃用的问题