Rubyのaliasは元のメソッドを再定義しても残る
タグ: ruby / 初版公開: 2014-09-12

Rubyではaliasを使ってメソッドに別名を付けることができる。 aliasの面白い点は、別名を付けたメソッドはaliasを評価した時点のメソッド定義を引き継ぐことだ。

別名を付けられたメソッドは、その時点でのメソッド定義を引き継 ぎ、元のメソッドが再定義されても、再定義前の古いメソッドと同 じ働きをします。あるメソッドの動作を変え、再定義するメソッド で元のメソッドの結果を利用したいときなどに利用されます。

以下のコードで確かめてみよう。

まずold methodを出力するmethodメソッドを定義する。 続いてそれにaliasold_methodという別名をつける。 最後にmethodメソッドがnew methodと出力するように再定義する。 この状態でmethodメソッドとold_methodメソッドを呼び出す。

def method
  puts 'old method'
end

alias old_method method

def method
  puts 'new method'
end

method
old_method

出力結果は以下のようになる。 methodメソッドはnew methodを出力し、methodを再定義しても、old_methodold methodと出力し続ける。 aliasを評価した時点のmethodメソッドの定義が、old_methodメソッドに引き継がれているためだ。

new method
old method

この挙動からRubyのaliasの実態は、別名を付けるというより、メソッドのコピーであることがわかる。