ブログ記事からの転載です。
さて、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"
これ、もっとスマートな方法ありますかね