読者です 読者をやめる 読者になる 読者になる

Ruby で refinements で mixin したメソッドから別のメソッドを呼び出す

Ruby

さて、Ruby では refinements 内で mixin したメソッド内から同モジュールのメソッドを呼び出すことはできません。

module Homu
    def homu
        p "homu"
    end

    def mami
        homu
    end
end

module ObjectEx
    refine Object do
        include Homu
    end
end

using ObjectEx

obj = Object.new
obj.mami
# => undefined local variable or method `homu' for #<Object:0x0000000271e510> (NameError)

[解決]

UnboundMethod を経由することで mixin したモジュールのメソッドを呼び出すことができます。

module Homu
    def homu
        p "homu"
    end

    def mami
#      homu
        # UnboundMethod を経由してメソッドを呼び出す
        Homu.instance_method(:homu).bind(self).call()
    end
end

module ObjectEx
    refine Object do
        include Homu
    end
end

using ObjectEx

obj = Object.new
obj.mami
# => "homu"

これ、もっとスマートな方法ありますかね