kind=defined
names=trace_var
visibility=public

--- trace_var(varname, hook) -> nil
--- trace_var(varname){|new_val| .... } -> nil
--- trace_var(varname, hook) -> [String|Proc]

グローバル変数 varname への代入のフックを登録します。

ここでの「グローバル変数」は、
[[unknown:特殊変数|組み込み変数]]も含めた `$' で始まる変数のことです。

この呼び出し以降、varname で指定したグローバル変数に
値が代入されるたびに hook かブロックが評価されます。hook が Proc オブジェクトの場合
代入された値がブロック引数に渡されます。文字列の場合はRubyコードとして評価されます。

trace_var がフックするのは明示的な代入だけです。
フックは複数登録できます。

フックを解除するには、hook に nil を
指定するか、[[m:Kernel.#untrace_var]] を用います。

hook が nil ならば、設定されていた
hook をすべて解除してその配列を返します(ブロックで登録されていれば
[[c:Proc]] オブジェクトで返されます)
それ以外は、nil を返します。

@param varname グローバル変数名を文字列か [[c:Symbol]] で指定します。
@param hook フックになる文字列または [[c:Proc]] オブジェクトです。
@return フックを登録した場合は nil を返します。解除した場合は解除した
        フックを並べた配列を返します。

    trace_var(:$v){|val| puts "hook: $v=#{val.inspect}" }
    $v = 1       #=> hook: $v=1
    $v = "foo"   #=> hook: $v="foo"
    $v.upcase!
    p $v         #=> "FOO"

@see [[m:Kernel.#untrace_var]]

