kind=defined
names=instance_eval
visibility=public

--- instance_eval(expr, filename = "(eval)", lineno = 1) -> object
--- instance_eval {|obj| ... }                           -> object

オブジェクトのコンテキストで文字列 expr またはオブジェクト自身をブロック引数とするブロックを
評価してその結果を返します。

オブジェクトのコンテキストで評価するとは評価中の self をそのオブジェクトにして実行するということです。
また、文字列 expr やブロック中でメソッドを定義すればそのオブジェクトの特異メソッドが定義されます。

ただし、ローカル変数だけは instance_eval の外側のスコープと共有します。

メソッド定義の中で instance_eval でメソッドを定義した場合は、囲むメソッドが実行されたときに
初めて instance_eval 内のメソッドが定義されます。これはメソッド定義のネストと同じです。
[[ref:d:spec/def#nest_method]] を参照してください。

@param expr  評価する文字列です。

@param fname 文字列を指定します。ファイル fname に文字列 expr が書かれているかのように実行されます。
             スタックトレースの表示などを差し替えることができます。

@param lineno 文字列を指定します。行番号 lineno から文字列 expr が書かれているかのように実行されます。
              スタックトレースの表示などを差し替えることができます。

例:

  class Foo
    def initialize data
      @key = data
    end
  private
    def do_fuga
      p 'secret'
    end
  end
  
  some = Foo.new 'XXX'
  some.instance_eval{p @key} #=> "XXX"
  some.instance_eval{do_fuga } #=> "secret" # private メソッドも呼び出せる
  
  some.instance_eval 'raise' # ..:10: (eval):1:  (RuntimeError)
  messg = 'unknown'
  some.instance_eval 'raise messg','file.rb',999 # file.rb:999: unknown (RuntimeError)

@see [[m:Module#module_eval]], [[m:Kernel.#eval]]


