大域変数は`$'から始まる名前を持っていて,プログラムのどこか らでも参照できる.初期化されていない大域変数は`nil'という特 別な値を持っている.
ruby> $foo nil ruby> $foo = 5 5 ruby> $foo 5
大域変数はプログラムのどこからでも参照,更新できるということ は,影響範囲が非常に広いということで,濫用は危険でもある.特 に名前が重なった時には致命的な問題の元になる.あまり使わない か,使うにしても他と重複しないような冗長な名前を付けた方が良 い(という事は上の変数名は悪い例である).
大域変数にはトレースをつけることができる.つまり,変数の値が 変更された時に実行される手続きを指定することができる.
ruby> trace_var :$x, proc{print "$x = ", $x, "\n"}
nil
ruby> $x = 5
$x = 5
5
このような値が設定されると手続きが起動されるような変数のこと をactve valueと呼ぶことがある.例えば,GUIである変数の値を常 に画面に表示するなどということにも使える.
大域変数のうち,$の後ろが記号1文字の変数(のうち多く)はシステ ム変数とも呼ばれて,特殊な意味を持つ.例えば,`$$'はrubyのプ ロセス番号を返すread-onlyの変数だ.システム変数のうち主なも のを以下にあげておこう.
$! エラーメッセージ
$@ エラーの発生位置
$_ 最後にgetsで読み込んだ文字列
$. 最後に読み込んだ行番号
$& 最後に正規表現でマッチした文字列
$1, $2... 正規表現のn番目の括弧にマッチした文字列
$~ 正規表現のマッチに関するデータ
$= 文字列のマッチで大文字小文字を区別するか
$/ 入力レコードセパレータ
$\ 出力レコードセパレータ
$0 rubyスクリプトの名前
$* rubyスクリプトのコマンドライン引数
$$ rubyのプロセス番号
$? 最後に実行した子プロセスのstatus
このうち,$_と$~はローカルスコープである.つまり,変数の値を 変更しても,メソッドの外側に影響を及ぼさない.これも例外とし て覚えておく必要がある.