Ruby的模块包含机制
作者:网络转载 发布时间:[ 2014/3/20 11:04:23 ] 推荐标签:Ruby 模块 代码
在 Ruby 中,模块可以被其他模块包含(这里,其他模块也包括类,因为类也是模块)。通过包含模块,可以构建出复杂的类层次结构。本文解释了当包含一个模块时,Ruby 内部都做了哪些实际的工作。
下面这段 Ruby 代码创建了 A, B, C 三个模块,C 包含 A 和 B。
A = Module.new
B = Module.new
module C
include A, B # Inclusion is done by this line
end
在模块 C 中,语句 include A, B 完成了模块包含的工作,该语句以 A, B 两个模块为作为参数,调用了模块 C 的 include 方法。一切都那么自然。
现在,把注意力放在 include 方法上,它的默认实现是 Module#include。根据 API 文档,它以相反的顺序对参数逐一调用 append_features 方法。对应的 C 函数是
rb_mod_include。
static VALUE
rb_mod_include(int argc, VALUE *argv, VALUE module)
{
int i;
ID id_append_features, id_included;
CONST_ID(id_append_features, "append_features");
CONST_ID(id_included, "included");
for (i = 0; i < argc; i++)
Check_Type(argv[i], T_MODULE);
while (argc--) {
rb_funcall(argv[argc], id_append_features, 1, module);
rb_funcall(argv[argc], id_included, 1, module);
}
return module;
}
从 Ruby 源码来看,除了对参数模块调用 append_features 方法外,还紧接着调用了 included 方法。所以,文档描述得并不完整,可能还没有更新。
append_features 和 included 都是回调方法。而 append_features 方法才是真正干活的地方,Ruby 通过这个方法将包含的逻辑转移到了被包含的模块上。这种精巧的设计能让你灵活地自定义包含模块的行为,既可以在发出包含动作的模块中重定义 include 方法,也可以从源头着手,重定义 append_features 方法。
再来看看 append_features 的默认实现 Module#append_features 都做了什么。下面是 API 文档上给出的源码:
rb_mod_append_features(VALUE module, VALUE include)
{
switch (TYPE(include)) {
case T_CLASS:
case T_MODULE:
break;
default:
Check_Type(include, T_CLASS);
break;
}
rb_include_module(include, module);
return module;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11