kind=defined
names=class_eval,module_eval
visibility=public

--- module_eval(expr, fname = "(eval)", lineno = 1) -> object
--- module_eval{|mod| ... }                         -> object
--- class_eval(expr, fname = "(eval)", lineno = 1)  -> object
--- class_eval{|mod| ... }                          -> object

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

モジュールのコンテキストで評価するとは、実行中そのモジュールが self になるということです。
つまり、そのモジュールの定義式の中にあるかのように実行されます。

ただし、ローカル変数は module_eval/class_eval の外側のスコープと共有します。
文字列が与えられ場合には、定数とクラス変数のスコープは自身のモジュール定義式内と同じスコープになります。
ブロックが与えられた場合には、定数とクラス変数のスコープはブロックの外側のスコープになります。


@param expr 評価される文字列。

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

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

例:

 class C
 end
 a = 1
 C.class_eval %Q{     
   def m                   # メソッドを動的に定義できる。
     return :m, #{a}
   end
 }
 
 p C.new.m        #=> [:m, 1]
 
@see [[m:Object#instance_eval]], [[m:Module.new]]

