两种情况有什么区别?

时间:2016-03-26 08:45:57

标签: 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

输出结果为:

true

但如果删除注释,则输出为:

false
false

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

1 个答案:

答案 0 :(得分:5)

让我们看一下Module#append_features

的C级别
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。默认情况下,此方法不执行任何操作。