なんとなく日々徒然と

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

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

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

今回は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をそこにくっつけています。

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

Tags:

gitで今やってる作業を一時退避する方法 vimのキーマップとleader

comments powered by Disqus