加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby模块和Module#append_features解释

发布时间:2020-12-17 03:16:20 所属栏目:百科 来源:网络整理
导读:最近我碰到了这个非常有趣的帖子: http://opensoul.org/blog/archives/2011/02/07/concerning-activesupportconcern/,它遍历(并解释)了ActiveSupport :: Concern源代码. 出现了一些问题,但最重要的是: 显然有一个名为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”文件中,名称为rb_mod_include)作为循环,它只为传递给它的每个Module参数调用mod.append_features(然后是mod.included).

默认的append_features实现(“eval.c”文件中的rb_mod_append_features)调用rb_include_module,这是执行实际工作的方法.

(实际上真正的工作是由include_modules_at以下几行完成的)

这意味着你完全正确地说你可以通过覆盖append_features来防止或破坏这个基本的ruby功能(至少如果你不调用super).

ActiveSupport :: Concern实际上调用super,只是在某些情况下它会推迟实际调用,直到某个“无关”模块包含“有关”模块.

通常最好覆盖include方法而不是append_features.包含被定义为“返回零”,因此破坏任何东西的概率更小.这就是所包含方法的文档建议.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读