两种情况有什么区别?

Mes*_*ssi 1 ruby

我想知道两种情况之间的区别:

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)

为什么输出与以前的输出不同?

Aet*_*rus 5

我们来看看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).这个函数处理添加方法和常量moduleinclude.

因此,如果你压倒了Module#append_features,而你忘了打电话super,那么模块将永远不会被包含在内.

你可能永远不想覆盖Module#append_features.如果要在包含模块时将"侦听器"附加到"事件",则可以覆盖Module#included.默认情况下,此方法不执行任