What is it, naokirin?

Ruby 3.3 の特殊変数

Rubyには、特殊変数、もしくは組み込み変数(Pre-defined variables)と呼ばれる $ から始まる変数が定義されています。

普段はほとんど使わないこともあり、忘れることも多いので、今回まとめてみます。

このページの内容は、Ruby 3.3.0での情報をもとにしています。

目次

入出力関連

変数 説明 スコープ 補足
$. IOオブジェクトが最後に読んだ行の行番号 グローバルスコープ Ruby起動時の初期値は0
$< すべての引数または標準入力で構成される仮想ファイル。定数 Object::ARGF の別名 グローバルスコープ 読み取り専用
$> 標準出力。 Kernel.#print、Kernel.#puts、Kernel.#p などのデフォルトの出力先になる グローバルスコープ
$stdout $> に同じ $> に同じ $> に同じ
$stderr 標準エラー出力 グローバルスコープ
$stdin 標準入力 グローバルスコープ
$FILENAME 仮想ファイル Object::ARGF で現在読み込み中のファイル名 グローバルスコープ
$_ 最後に Kernel.#gets または Kernel.#readline で読み込んだ文字列 ローカルスコープ、スレッドローカル

例外関連

変数 説明 スコープ 補足
$! 最後に発生した例外 スレッドローカル 読み取り専用
$@ 最後に例外が発生した時のバックトレースを表す配列 スレッドローカル

正規表現(パターンマッチ)

変数 説明 スコープ 補足
$& 現在のスコープで最後に成功した正規表現でパターンマッチした文字列 ローカルスコープ、スレッドローカル 読み取り専用
$' 現在のスコープで最後に成功した正規表現でパターンマッチした部分より後ろの文字列 ローカルスコープ、スレッドローカル 読み取り専用
$` 現在のスコープで最後に成功した正規表現のパターンマッチした部分より前の文字列 ローカルスコープ、スレッドローカル 読み取り専用
$+ 現在のスコープで最後に成功した正規表現でパターンマッチした中で最後のカッコに対応する部分文字列 ローカルスコープ、スレッドローカル
$1, $2, … 最後に成功したパターンマッチでn番目の括弧にマッチした値が設定される ローカルスコープ、スレッドローカル 読み取り専用
$~ 現在のスコープで最後に成功したマッチに関する MatchDataオブジェクト ローカルスコープ、スレッドローカル MatchDataからn番目のマッチを取り出すには $~[n] を使う

引数処理

変数 説明 スコープ 補足
$* Rubyスクリプトに渡された引数の配列 グローバルスコープ

ファイル、文字列処理

変数 説明 スコープ 補足
$, Array#join、Kernel.#printで利用されるデフォルトの出力フィールドの区切り文字列 グローバルスコープ Ruby 2.7以降ではnil以外への変更は非推奨
$/ 入力レコードの区切り文字列。Kernel.#getsなどでの「行」の区切りで利用される グローバルスコープ 正規表現の利用は不可
$-0 $/に同じ $/に同じ $/に同じ
$; String#split で引数を省略した場合の区切り文字 グローバルスコープ Ruby 2.7以降ではnil以外への変更は非推奨
$-F $;に同じ $;に同じ $;に同じ
$\ 出力レコード区切りを表す文字列 グローバルスコープ

警告出力の挙動変更(冗長メッセージの設定)

変数 説明 スコープ 補足
$-W コマンドラインオプションの-Wに指定した値。
0: 警告を出力しない
1: 重要な警告のみ出力(デフォルト)
2: すべての警告を出力する
グローバルスコープ この変数には代入できない。$VERBOSEと対応している
$DEBUG trueのとき、インタプリタデバッグモードになる。コマンドラインオプション -d を指定したときに true になる。 グローバルスコープ
$-d $DEBUGに同じ $DEBUGに同じ $DEBUGに同じ
$VERBOSE 冗長メッセージのフラグ。Rubyインタプリタコマンドラインオプション -v で設定される。
nil: 警告を出力しない
false: 重要な警告のみ出力(デフォルト)
true: すべての警告を出力
グローバルスコープ
$-v $VERBOSEに同じ $VERBOSEに同じ $VERBOSEに同じ
$-w $VERBOSEに同じ $VERBOSEに同じ $VERBOSEに同じ

コマンドラインオプションの指定フラグ

  変  
  数  
説明 スコープ 補足
$-a 自動 split モードを表す。コマンドラインオプション -a を指定したときにtrueになる。trueの場合、各ループの先頭で以下が実行される
$F = $_.split
グローバルスコープ この変数には代入できない
$-l コマンドラインオプション -l を指定したときに true になる グローバルスコープ この変数には代入できない
$-p コマンドラインオプション -p を指定したときに true になる グローバルスコープ この変数には代入できない

その他

変数 説明 スコープ 補足
$$ 実行中のRubyプロセスのID グローバルスコープ
$0 現在実行中のRubyスクリプトの名前を表す文字列 グローバルスコープ
$PROGRAM_NAME $0に同じ $0に同じ $0に同じ
$? このスレッドで最後に終了した子プロセスのステータス スレッドローカル 読み取り専用
$" requireでロードされたファイル名の配列 グローバルスコープ
$LOADED_FEATURES $"に同じ $"に同じ $"に同じ
$: Rubyライブラリをロードするときの検索パス グローバルスコープ
$LOAD_PATH $:に同じ $:に同じ $:に同じ
$-I $:に同じ $:に同じ $:に同じ
$-i in-place 置換モードで用いる文字列。コマンドラインオプション -i で指定した値が設定される。-iオプションを指定していないときは nil になる グローバルスコープ

現在使用されていない変数

変数 説明 スコープ 補足
$KCODE 通常のグローバル変数 グローバルスコープ 以前は文字コードの指定に利用。Ruby3.0以降では特殊変数から通常のグローバル変数に変更
$-K $KCODEに同じ $KCODEに同じ $KCODEに同じ
$= 過去の互換性のために残されている グローバルスコープ 値は常にfalse、代入しても無視される
$SAFE 通常のグローバル変数 グローバルスコープ 以前はSafe levelの指定に利用。Ruby3.0以降では特殊変数から通常のグローバル変数に変更

まとめ

今回は普段Rubyで頻繁に使うことは少ない、特殊変数についてまとめてみました。

コマンドラインオプションとも密接に関わっている部分もあるので、次はコマンドラインオプションも調べてまとめてみようと思います。