Ruby で define_method で定義した中から super を呼び出す

次のようなコードで define_method 内から super を呼びだそうとしたらエラーになりました。

module M
    define_method :homu do
        p :superhomu
        # ここで元のメソッドを呼び出したかった
        super
    end
end

class X
    prepend M
    
    def homu
        p :homu
    end
end

X.new.homu
# Error: in `block in <module:M>': implicit argument passing of super from method defined by define_method() is not supported.

解決

super() をつければ解決します。

module M
    define_method :homu do
        p :superhomu
        # () を着けて呼び出す
        super()
    end
end

class X
    prepend M
    
    def homu
        p :homu
    end
end

X.new.homu # OK

これで super から X#homu が呼び出されます。

参照

http://qiita.com/akicho8/items/44b10b9f8dad1c0e4a40