names=instance_eval
visibility=public
kind=defined

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

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

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

ただし、ローカル変数だけは、文字列 expr の評価では instance_eval の外側のスコープと、ブロックの評価ではそのブロックの外側のスコープと、共有します。

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

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

@param filename 文字列を指定します。ファイル filename に文字列 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]]

