为啥 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 上已被弃用,还有啥替代方案?
@angular-cli 安装失败,请求被弃用@2.88.2:请求已被弃用(mac)