Rubyメタプログラミング 最初の一歩
メタプログラミング?
ざっくり言うとプログラムでプログラムを作る。
Rubyはメタプログラミングの柔軟性が強力すぎるゆえ、
Ruby on Railsはじめ色んな所で「黒魔術」と呼ばれている。
実際どんなの?
sendメソッドを使用し、引数にオブジェクトが持つメソッドの名前を添えることでそのオブジェクトのメソッドを呼ぶことができる。
a = 10 # => 10 a.to_s # 文字列化する # => "10" a.send(:to_s) # sendメソッドでto_sメソッドを呼び出す ★a.to_sと全く同じ # => "10" a.send("to_s") # sendメソッドにはシンボル・文字列どちらも使える ★a.to_sと全く同じ # => "10"
何が嬉しいの?
これが威力を発揮するのはsend()の中身を実行時にイジる時。
a = 10 # => 10 method = :to_s # 変数に呼び出したいメソッド名の文字列を格納する。 a.send(method) # a.to_sが実行される。 # => "10" method = :next a.send(method) # 変数の内容変更に伴い、今度はa.nextが実行される。 (nextは次の整数を返すメソッド) # => 11 method = "to_s" a.send(method) # シンボルと文字列両方使えるが、シンボルを使うのが慣習みたいだ。 # => "10"
このように、a.send(method)
という部分を全く変えずに、実行時に外部からその動作を定義することができる。