既存のメソッドをすり替える方法

すでにあるメソッドに処理を追加したい場合。
すでにあるメソッドを踏襲した新しいメソッドを定義して、メソッドの呼び出し側を新しいメソッドに向けることができますが
現実的でないですね。

ではどうやってすり替えるか。
実現手段はいくつかあると思いますが、ここではアラウンドエイリアスを使ってみます。

今回はStringのto _sメソッドを、

文字列(文字列長)

と表示するよう変えてみる。

今日のコードではaliasを使いますが、二度呼ぶとエラーとなってしまうのでirbを都度起動してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
str = "あいう"

str.to_s #=> "あいう"

class String
  alias :old_to_s :to_s

  def to_s
    old_to_s + "(" + length.to_s + ")"
  end
end

str.to_s #=> "あいう(3)"
str.old_to_s #=> "あいう"

この前のrubyのオープンクラス - なんとなく日々徒然と使ってStringクラスにコーディングしていきます。

構文は
alias 新しいメソッド名 古いメソッド名
です。
今回の例ではto sにold to _sという別名をつけます。

1
2
3
4
5
6
7
8
9
10
str = "あいう"

str.to_s #=> "あいう"

class String
  alias :old_to_s :to_s
end

str.to_s #=> "あいう" 
str.old_to_s #=> "あいう"

それでto _sを書き換えちゃいます。

1
2
3
  def to_s
    old_to_s + "(" + length.to_s + ")"
  end

to sが呼ばれた場合は書き換えたメソッドが呼ばれ、old to sが呼ばれた場合は昔のメソッドが呼ばれる状態です。
書き換えられたto
sは昔のto sをold to _sで呼び、lengthをそこにくっつけています。

これでメソッドのすり替えが完了です。

Comments