[Ruby] 冗長モード(-v -w -W)でスクリプトを実行して安全なコードを書く

概要

コマンドラインからRubyスクリプトを実行する際に、冗長モードのオプションを利用して、コードに潜む各種警告を表示させる。警告とは、文法上問題ないが、曖昧な構文を使用していたり、使われていない変数が定義されていると言った、将来的にバグのキッカケになりそうな内容に対する指摘のことで、これにいち早く気づいて修正することで将来的なバグの発生を抑えることができる。

本記事では、-wオプション、-Wオプション、-vオプションについて一通り確認する

前提

以下環境で動作確認済み

debian 8.6
ruby 2.2.2

通常モード

以下のコードでは、bに2を代入しているが、出力しているのはaのみで、bは実質不要だ。

a = 3
b = 2
puts a

といっても、上記コードを普通に実行すると普通にaが出力されるだけで特に何も無い。

vagrant$ ruby verbose.rb
3

これでは、bが無駄に宣言されていることに気づけ無いので、以降ではそれに気づくためのオプションを紹介する。

-w オプション

-w オプションは、冗長モードで実行する。
前項のコードを、-wオプションをつけて実行すると以下のようになる

vagrant$ ruby -w verbose.rb
verbose.rb:2: warning: assigned but unused variable - b
3

2行目のbは使われていないのに代入されているよと警告が表示される

-v オプション

-v オプションは、-w オプションとほぼ同じだが、実行時にRubyのバージョンを確認することができる。

vagrant$ ruby -v verbose.rb
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
verbose.rb:2: warning: assigned but unused variable - b
3

そんなに使いみちは無い気がする。

-W オプション

-W オプションは、-W[Level]と、警告レベルを指定することで、どこまでの警告を出力するかを制御して実行する。

-Wオプションの詳細的なパラメータは以下の通り

-W0 警告を出力しない
-W1 重要な警告のみ
-W2 すべての警告を出力する

例えば-W2と指定すると、-wと同等に、全ての警告を出力するようになる。

vagrant$ ruby -W2 verbose.rb
verbose.rb:2: warning: assigned but unused variable - b
3

-W1とすると、重大な警告のみ表示するようになり、これまでの警告は重大ではないらしいので表示されない

vagrant$ ruby -W1 verbose.rb
3

重大な警告について

前項で現れた「重大な警告」の例として、以下のようなコードがある

N = 3
N = 2
p N

定数Nを再代入してからの出力。明らかにダメなことをしてる。

実は重大な警告については、-wオプションを使わずとも、普通に実行した際にも出力される。

vagrant$ ruby verbose.rb
verbose.rb:2: warning: already initialized constant N
verbose.rb:1: warning: previous definition of N was here
2

この重大な警告をあえて表示したくない場合は、-Wオプションに0を指定して全ての警告を表示しないようにする

vagrant$ ruby -W0 verbose.rb
2

まずこのような使い方は無い気はする。

ちなみに上記実行結果を見て分かる通り、Rubyでは定数の再代入は、重大な警告こそ出るが文法上許可されてる(そのため後から代入した2が出力される)

その辺りの謎の仕様が気になった方は別途調べてみると深みにはまれる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です