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

メタプログラミングRuby その10 [学習メモ]

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

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

金曜日 : コードを記述するコード

6.2 Kernel#eval

プログラムを記述するコードをもっとも単純に実行するには、プログラムを文字列で生成してそれを実行すればよい。
eval メソッドはそれを可能にする。

s = "puts 'hello'"

eval s
# => hello

任意コード実行はいつだってセキュリティホールにつながるが、それに近い物を感じる。
外部からの文字列を受け取らないようにすべきなのだろう。

6.7 フックメソッド

ruby ではインスタンスの生成時、クラスの継承が起こった時などにコードを実行させることができる。

class String
  def self.inherited(subclass)
    puts "#{self}#{subclass} に継承された"
  end
end

class MyString < String; end
# => String は MyString に継承された

これらフックメソッドは考えられるだけのタイミングで定義することができる。

本章はクイズや実際の gem での例が中心となっている。
(本の中では)一週間の学習が終わり、これで本書も一区切りと言ったところだ。
この後は豪華な付録?として rails 内部のメタプログラミングを見ていくことになる。
もっとも有名な gem である rails は私を含め多くの人が ruby に触れるきっかけとなったライブラリであり、何か感慨深い物がある。