2016-03-26 1 views
1

私は2例との違いを知りたい:2つのケースの違いは何ですか?

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が含まれるためのモジュールであり、2番目のパラメータincludeは別名basemoduleを含むモジュールまたはクラスである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; 
} 

のCレベルを見てみましょう。

rb_include_module(include, module)という関数呼び出しがあります。この関数は、のメソッドと定数をincludeに追加する処理を行います。

Module#append_featuresを無効にして、superを呼び出すことを忘れた場合、モジュールは実際には含まれません。

Module#append_featuresを上書きすることは決してできません。モジュールが含まれているときに「イベント」に「リスナー」を添付する場合は、Module#includedを上書きできます。デフォルトでは、このメソッドは何もしません。

関連する問題