demolog

備忘録. 雑なあまりにも雑な

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の中身は変化しない