class_evalとinstance_eval

2011-07-22#ruby

以下のようなクラスとインスタンスについて考えていく。

Person = Class.new # Personクラスの作成(Classクラスのインスタンスの作成)
naoty = Person.new # Personクラスのインスタンスの作成

今回はclass_evalとinstance_evalについて。どっちとも引数のブロック内の文字列をRubyコードとして評価して実行するのだが、実行するコンテキストが異なる。

Person.class_eval do
  def greet
    p 'Hello, my world!'
  end
end
naoty.greet #=> "Hello, my world!"
Person.instance_eval do
  def greet
    p 'Hello, world!'
  end
end
Person.greet #=> "Hello, world!"
naoty.greet #=> NoMethodError: undefined method 'greet' for ...