我想知道两种情况之间的区别:
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
输出结果为:
true
但如果删除注释,则输出为:
false
false
为什么输出与以前的输出不同?
答案 0 :(得分:5)
让我们看一下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;
}
第一个参数module
是要包含的模块,第二个参数include
是包含module
的模块或类,又名base
。
您可以看到函数调用rb_include_module(include, module)
。该函数处理将module
的方法和常量添加到include
。
因此,如果您覆盖Module#append_features
,并且忘记在其中调用super
,那么该模块将永远不会被包含在内。
您可能永远不想覆盖Module#append_features
。如果要在包含模块时将“侦听器”附加到“事件”,则可以覆盖Module#included
。默认情况下,此方法不执行任何操作。