最近我碰到了这篇非常有趣的帖子:http://opensoul.org/blog/archives/2011/02/07/concerning-activesupportconcern/,它遍历(并解释)了ActiveSupport::Concern
源代码。
出现了一些问题,但最重要的是:
显然有一种名为append_features
的方法(至少由文档提供):" Ruby的默认实现方法将添加此模块的常量,方法和变量到基础模块" 。
我一直认为模块与方法查找链意义上的类相同 - 唯一的区别是你不能从中实例化对象,并且它没有被定义为& #39;超'这个类的(因为模块实际上不是一个类)。意味着当一个类includes
一个模块时,该模块只是作为类的继承层次结构中的直接父项添加,因此,将查看包含类中缺少的方法在模块中。
但如果是这样,那么append_features
实际"将方法添加到基本模块" 意味着什么意味着什么呢?实际上可以通过覆盖此方法(ActiveSupport::Concern
实际执行的方法)来阻止此行为。
有人可以在我脑海里创造一些订单吗?
答案 0 :(得分:6)
基本上, append_features
是 - 或应该被视为 - 深度内部红宝石方法。
Module.include
方法定义为(在“eval.c”文件中,名称为rb_mod_include
)作为循环,只调用mod.append_features
(然后mod.included
)传递给它的每个Module
参数。
默认 append_features
实施(“eval.c”文件中的rb_mod_append_features
),调用rb_include_module
,是完成实际工作的方法。
(实际上真正的工作是由include_modules_at
以下几行完成的)
这意味着您完全正确地说,您可以通过覆盖append_features
阻止或破坏此基本ruby功能(至少如果您不调用super
})。
ActiveSupport::Concern
实际上会调用super
,只是在某些情况下,它会推迟实际的通话,直到“关注”模块被某些“非关注”模块包含在内。
通常最好覆盖included
方法,而不是append_features
。 included
定义为"return nil"
,因此破坏任何内容的概率都较小。这就是included
方法建议的文档。