メタプログラミング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(①)を増やすだけで良いのでメソッド追加より見通しがよくなります。