Ruby模块和Module#append_features解释

时间:2013-06-09 06:36:14

标签: ruby inheritance module

最近我碰到了这篇非常有趣的帖子:http://opensoul.org/blog/archives/2011/02/07/concerning-activesupportconcern/,它遍历(并解释)了ActiveSupport::Concern源代码。

出现了一些问题,但最重要的是:

显然有一种名为append_features的方法(至少由文档提供):" Ruby的默认实现方法将添加此模块的常量,方法和变量到基础模块"

我一直认为模块与方法查找链意义上的类相同 - 唯一的区别是你不能从中实例化对象,并且它没有被定义为& #39;超'这个类的(因为模块实际上不是一个类)。意味着当一个类includes一个模块时,该模块只是作为类的继承层次结构中的直接父项添加,因此,将查看包含类中缺少的方法在模块中。

但如果是这样,那么append_features实际"将方法添加到基本模块" 意味着什么意味着什么呢?实际上可以通过覆盖此方法(ActiveSupport::Concern实际执行的方法)来阻止此行为。

有人可以在我脑海里创造一些订单吗?

1 个答案:

答案 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_featuresincluded定义为"return nil",因此破坏任何内容的概率都较小。这就是included方法建议的文档。