Ruby模块和Module#append_features解释
最近我碰到了这个非常有趣的帖子:
http://opensoul.org/blog/archives/2011/02/07/concerning-activesupportconcern/,它遍历(并解释)了ActiveSupport :: Concern源代码.
出现了一些问题,但最重要的是: 显然有一个名为append_features的方法(至少由文档)说:“Ruby的默认实现方法会将此模块的常量,方法和变量添加到基础模块”. 我一直认为模块在方法查找链意义上与类相同 – 唯一的区别是你不能从中实例化对象,并且它没有被定义为这个类的“超类”(因为一个模块)实际上并不是一个班级.这意味着当一个类包含一个模块时,该模块只是作为类的继承层次结构中的直接父项添加,因此,将在模块中查找包含类中缺少的方法. 但是,如果是这种情况,那么append_features实际上“将方法添加到基本模块”是什么意思,这意味着您可以通过重写此方法(ActiveSupport :: Concern实际上这样做)来实际防止此行为. 有人可以在我脑海里创造一些订单吗? 解决方法
基本上,append_features是 – 或者应该被认为 – 是一种深度内部的ruby方法.
Module.include方法被定义(在“eval.c”文件中,名称为 默认的append_features实现(“eval.c”文件中的 (实际上真正的工作是由 这意味着你完全正确地说你可以通过覆盖append_features来防止或破坏这个基本的ruby功能(至少如果你不调用super). ActiveSupport :: Concern实际上调用super,只是在某些情况下它会推迟实际调用,直到某个“无关”模块包含“有关”模块. 通常最好覆盖include方法而不是append_features.包含被定义为“返回零”,因此破坏任何东西的概率更小.这就是所包含方法的文档建议. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |