hagetak's blog

どうも、はげたかです。

メタプログラミングとは - Rubyを例に説明

[メタプログラミング]最近良く聞く、メタプログラミングとは

最近、メタプログラミングという言葉をよく聞く。といっても、結構前からだが、意識し始めたのは最近。

メタってなんだよ、メタってと思っていた時期がありましたが、ようやくなんぞやと調べる気になった。

ruby の技術力を少しずつ上げていきたいので、ruby を例に説明する。

メタプログラミングとは

meta_programming_08.rb

class Rabbit
  class << self
    def colors
      [:black, :brown, :white, :mixed]
    end
  end
end
 
p Rabbit.colors

また、クラスメソッドを定義することは、現場のコードでしばしば見られるパターンなのに、> 実際は複雑であることも理由の一つです。Ruby初心者からすると、「class << self」のよう> なコードを見たら、ギョッとすることでしょう(私もそうでした)。

コンパイルなしに実行できる

ゲッターとセッターを自動生成

いくつものインスタンス変数があり、それぞれにゲッター/セッターを定義するのは面倒である

そこで、このメタプログラミングを用いて、(実行時に)自動生成させる

class Item
    def get_price
        @price
    end
    def set_price v
        @price = v    
    end

    def get_name
        @name
    end
    def set_name v
        @name = v        
    end
    # インスタンス変数の数だけセッターとゲッターが存在する
end
class Item
    def define_accessor *plist
        self.class.class_eval do
            plist.each do | property|
                define_method "get_#{property}" do
                    @property
                end
                define_method "set_#{property}" do |v|
                    @property = v
                end
            end
        end
    end
end

item = Item.new
item.define_accessor "price", "name", "category"
item.methods.grep(:get_price)

個人的にこれはよく書けたな、と自画自賛をしたいところだが、ネストが深い。

さいごに

ざっくりメタプログラミングというものを知った。動的にメソッドを追加することなのかな。初見では、メリットが分かりづらかったが、セッター・ゲッターの例から少し便利さを知ることができた。

こうしたほうが Ruby っぽい。こうしたほうが綺麗。テクニックなど、教えて下さい。

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版