Ruby

patch

どこかのコードで面白いpatchの当て方をしていたので備忘録がわりに残しとこうかと思います。

前提条件

  • patchしたいクラス及びmoduleをrequireできていること

コード

test.rb
class Test
  def test i
    !i.nil?
  end
end
test2.rb
require_relative './test'
class Test
  alias test2 test

  def test i=nil
    test2(i) || 'hello test2'
  end
end

require_relative './test2'
p Test.new.test
p Test.new.test 'test'
output
hello test2
true

testばっかりでなんやねんという感じですが、上手いことTest classを使っているところに、test2.rbを噛ませてやれば、test2.rbで定義したtest関数が実行されるわけですね。

aliasについて蛇足の解説

alias 新メソッド名 旧メソッド名

と定義してpatchを当てたい関数を一旦別名で宣言することができる。
その後旧メソッドをオーバーライドしても新メソッドが以前の中身を保持しているため新メソッド内で旧メソッドを呼び出す事ができたりする。

alias_methodの方が色々制御できるっぽい。
後これ書いている内に色々と調査していたら結構普通の使い方らしい
http://ref.xaio.jp/ruby/classes/module/alias_method