blog.waterlow.work

Ruby, Rails, js, etc...

動的プログラミング2

前回の復習

オープンクラスとは?
→オープンなクラスというわけではない!クラスをオープンして拡張しようというニュアンス。通常のクラス定義と同じ書き方で新しいメソッドを定義できる。

7-2 BasicObject#method_missing

なんだそれ?
→NoMethodError例外が発生したというメッセージを出力するメソッド。method_missingの実装はC言語で実装されている。

使い方
→オーバーライドすれば定義されていないメソッドに対してもNoMethodErrorを発生させずに処理できる。呼び出しに失敗したメソッドとメソッドに渡された引数が渡される。
以下のコードは委譲(他のクラスに仕事を任すパターン)を実装したもの。

class DelegateArray
  def initialize
    @array = []
  end

  def method_missing(name, *args)
    @array.__send__ name, *args
    # 第一引数に渡された名前のメソッドを呼び出す。
  end
end

d_array = DelegateArray.new
d_array << 1 [1]
puts d_array #=> 1

注意点
1.method_missing内で存在しないメソッドを呼ぶと無限ループになる
2.親クラスでmethod_missingのオーバーライドが行われていると子クラスでオーバーライドした時にどうさに不具合が出るかも。→指定のメソッドが呼び出されたときの処理だけ書くのが良い。