Refinementsメモ
Ruby2.1で追加されたRefinementsのメモ
バージョンは、2.1.10にて確認
class Parent def hoge puts "Parent::hoge" end end class Child < Parent def hoge puts "Child::hoge" end end module RefineExample refine Child do def hoge2 puts "RefineExample::Child::hoge2" end def hoge super puts "RefineExample::Child::hoge" end end end h = Child.new h.hoge # Child::hoge p Child.ancestors # [Child, Parent, Object, Kernel, BasicObject] p h.methods().grep(/hoge/) # [:hoge] h2 = Child.new using RefineExample # Child::hoge # RefineExample::Child::hoge h2.hoge h2.hoge2 # RefineExample::Child::hoge2 p Child.ancestors # [Child, Parent, Object, Kernel, BasicObject] p h2.methods().grep(/hoge/) # [:hoge]
メモ
- usingしたタイミングでRefinementsに切り替わる
- インスタンス作成前でも後でも関係なしに
- refineのメソッド内でsuperを指定すると、refine元のメソッドがコールされる
- refineされてもModule#ancestorsの中身は変化しない
- refineされてもobj.methodsの中身は変化しない