読者です 読者をやめる 読者になる 読者になる

メタプログラミングRuby 第三章メソッド 動的メソッド

動的メソッド

前回は 「動的ディスパッチ」をメインに説明しました。

今回は本丸である動的メソッドの説明を行います。

動的メソッド定義

動的メソッドとは動的にclassとモジュールにメソッドを追加出来ます。

使い方は簡単で「define_method メソッド名」を定義してブロックの中身に 処理コードをつければOKです。

class Hello
    define_method "hello" do
        puts "hello"
    end
end

obj = Hello.new
obj.hello # "hello"

上のコード見ても何言ってるのって感じですよね。 define_methodが効力を発揮するのは同じような処理をまとめるのに 適しています。

例として、たいやきの価格を求めるコードを書いてみます。

メソッドでかく

class Taiyaki
  def anko_price
    puts 120
  end
  def cheese_price
    puts 200
  end
  def cream_price
    puts 220
  end
end

Taiyaki.new.anko_price

今回は例として「anko・cheese・cream」の3つの味の価格を求めるコードです。 味が何十種類もあったらメソッドを作るの面倒ですよね。

動的メソッド

class Taiyaki_dynamic
  def initialize
    hash = {"anko" => 120,"cheese" => 200,"cream" => 220} #①味と価格対応ハッシュ
    hash.each do |key,val|
      Taiyaki_dyanamic.price(key,val) #②メソッド作成
    end
  end

  def self.price(name,price) #クラス・メソッド
    define_method "#{name}_price" do
      puts price
    end
  end
end

Taiyaki_dynamic.new.anko_price #120
Taiyaki_dynamic.new.cheese_price #200

今回はmethod作成を self.priceというクラスメソッドにまとめています。 そして initializeメソッド(②)で、クラスをnewした際各味の価格を呼び出すメソッドを作成します。 たいやきの味が増えた場合はhash(①)を増やすだけで良いのでメソッド追加より見通しがよくなります。