2016-03-26 160 views
1

我想知道的两种情况之间的差异:这两种情况有什么区别?

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

我不认为这段代码会做你认为它的作用。比较这些常数是没有意义的。 – sevenseacat

+0

有[[<]](http://ruby-doc.org/core-2.3.0/Module.html#method-i-3C)方法来测试模块是否是另一个模块的子类,但这不是这里的情况。 – tadman

+1

谢谢你的回复,它不是比较常量,检查C类是否是M的子类。 – Messi

回答

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 C级是在被包括在模块中,并且所述第二参数include是包括module模块或类,亦称base

你可以看到一个函数调用rb_include_module(include, module)。该函数处理将module的方法和常量添加到include中。

因此,如果您忽略了Module#append_features,并且您忘记了在其中调用super,那么该模块将永远不会包含在内。您可能不想覆盖Module#append_features。如果您想在包含模块时将某个“监听者”附加到“事件”,则可以覆盖Module#included。默认情况下这个方法什么都不做