UnboundMethod
は仕事では直接的にはお世話になりませんが、
何事もやってみることもありだと思うのでちょっと遊んでみました。
マニュアルによると、instance_method
を使うと良さそうです。
class Hoge
def initialize(val)
@val = val
end
def val
@val
end
class << self
def class_method
15
end
end
end
unbind_method = Hoge.instance_method(:val)
hoge = Hoge.new(20)
p unbind_method.bind(hoge).call #=> 20
Module
クラスに定義されているので、必然的にクラスがレシーバーになります。
インスタンスメソッドだけはつまらないので、クラスメソッドにも同じことをやってみます。
特異クラスを取得して、class_method
メソッドを引数に渡して実現しています。
singleton = Hoge.singleton_class
unbind_class_method = singleton.instance_method(:class_method)
p unbind_class_method.bind(Hoge).call #=> 15
Method
オブジェクトを作ってからあえてunbind
メソッドを呼び出して実現しています。
こっちのほうがシンプル?かなと
bind_class_method = Hoge.method(:class_method)
unbind_class_method = bind_class_method.unbind
p unbind_class_method.bind(Hoge).call #=> 15