Ruby勉強

インターネットの企画職な人がプログラミングを勉強するブログ

Ruby Methodクラス UnboundMethodクラス

Methodオブジェクトは、メソッドを保存でき、callで実行できる

class A
  def hoge
    puts 1
  end
end
a = A.new.method(:hoge)
a.call #=>

UnboundMethodはメソッドの付け替えが可能 同じクラス、もしくはサブクラスにしかつけかえられない

class C
  def my_method
    88
  end
end
class A
end
u = C.instance_method(:my_method)
p u.bind(C.new).call #=> 88
p u.bind(A.new).call #=> TypeError: bind argument must be an instance of C
  • self の instance_methodを指定するとメソッドをUnboundMethodとしてとりだすことができる

モジュールのメソッドを使ってbindする

module M
  def my_method
    88
  end
end
class A
end
u = M.instance_method(:my_method)
p u.bind(A.new).call #=> 88
  • 以上が成功するのは、module Mのクラスが、Moduleクラスだから。ClassのsuperclassはModuleだからだとおもう。たぶん。