メタプログラミングとは - 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 っぽい。こうしたほうが綺麗。テクニックなど、教えて下さい。
- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/10/10
- メディア: 大型本
- この商品を含むブログ (2件) を見る