Ruby の #method_added と #singleton_method_added の違い

両方ともクラスやモジュールにメソッドが定義された時に呼ばれるメソッドですが、 #method_added は『メソッドの定義』、#singleton_method_added は『特異メソッドの定義』という違いがあります。

[コード]

class X
    # #method_added はクラスメソッドとして定義する必要がある
    def self.method_added name
        puts "== method_added =="
        puts name
    end

    # #singleton_method_added はメソッド定義
    def singleton_method_added name
        puts "== singleton_method_added =="
        puts name
    end

    def method
        
    end
end

x = X.new

def x.singleton_method
    
end

[出力]

== method_added ==
singleton_method_added
== method_added ==
method
== singleton_method_added ==
singleton_method

#method_added はクラスメソッドとして定義する必要があることに注意。