Rubyは未使用変数の代入やメソッドの再定義など、実行に支障はないがバグの原因になりやすいコードに対して警告を出す機能がある。-w-Wオプションで、警告を表示するかどうかや表示するレベルを制御できる。構文エラーの有無だけを確認したい場合は【Ruby】ruby -cオプションで構文チェックする を参照。

デフォルトでは警告が表示されない

オプションを指定しない場合、多くの警告は表示されない。

$ cat warn.rb
def foo
  x = 1
end

$ ruby warn.rb

fooメソッド内で変数xに値を代入しているが使用していない。しかしオプションなしでは何も表示されない。

-w で警告を表示する

-wオプションを付けると、未使用変数の代入など詳細な警告が表示される。

$ ruby -w warn.rb
warn.rb:2: warning: assigned but unused variable - x

メソッドの再定義も警告の対象になる。

$ cat redefine.rb
class Foo
  def bar; end
  def bar; end
end

$ ruby -w redefine.rb
redefine.rb:3: warning: method redefined; discarding old bar
redefine.rb:2: warning: previous definition of bar was here

-W でレベルを指定する

-Wオプションでは、警告を表示するレベルを数値で指定できる。

レベル意味
-W0警告を表示しない
-W1重要な警告のみ表示する(デフォルト)
-W2すべての警告を表示する(-wと同じ)
$ ruby -W0 warn.rb

$ ruby -W1 warn.rb

$ ruby -W2 warn.rb
warn.rb:2: warning: assigned but unused variable - x

未使用変数の警告は「すべての警告」に分類されるため、-W1では表示されず-W2で初めて表示される。

$VERBOSE との対応

警告レベルはグローバル変数$VERBOSEにも反映される。

$ ruby -W0 -e 'p $VERBOSE'
nil

$ ruby -W1 -e 'p $VERBOSE'
false

$ ruby -W2 -e 'p $VERBOSE'
true

$ ruby -w -e 'p $VERBOSE'
true

$VERBOSEに値を代入すると、実行中に警告レベルを切り替えられる。Kernel#warnで出力するメッセージは$VERBOSEnilの場合のみ抑制される。

$ ruby -e '
$VERBOSE = nil
warn "suppressed"
$VERBOSE = true
warn "shown"
'
shown

ただしdef内の未使用変数に対する警告のような構文解析時の警告には効果がない。Rubyはスクリプト全体を先にパースしてから実行するため、パース時点で発生する警告は実行中に$VERBOSEを書き換えても間に合わない。

$ ruby -w -e '
$VERBOSE = nil
def foo
  x = 1
end
foo
'
-e:4: warning: assigned but unused variable - x