我想知道两种情况之间的区别:
module M
# def self.append_features(base)
# if base < self then p true
# else p false
# end
# end
end
class C
include M
end
if C < M then p true
else p false
end
Run Code Online (Sandbox Code Playgroud)
输出是:
true
Run Code Online (Sandbox Code Playgroud)
但如果删除注释,输出结果为:
false
false
Run Code Online (Sandbox Code Playgroud)
为什么输出与以前的输出不同?
我们来看看C级别 Module#append_features
static VALUE
rb_mod_append_features(VALUE module, VALUE include)
{
if (!CLASS_OR_MODULE_P(include)) {
Check_Type(include, T_CLASS);
}
rb_include_module(include, module);
return module;
}
Run Code Online (Sandbox Code Playgroud)
第一个参数module是将被包括在模块中,第二个参数include是包括模块或类module,又名base.
你可以看到一个函数调用rb_include_module(include, module).这个函数处理添加方法和常量module成include.
因此,如果你压倒了Module#append_features,而你忘了打电话super,那么模块将永远不会被包含在内.
你可能永远不想覆盖Module#append_features.如果要在包含模块时将"侦听器"附加到"事件",则可以覆盖Module#included.默认情况下,此方法不执行任