最近こちらの記事を読んでいて、 以下のコードの意味が解らなかったので調べてみました。
if $0 == __FILE__
# 何らかの処理
end
まず結論から言うと「requireされた時は実行したくないけど、スクリプトファイルを直接実行した時は処理したい」 場合に使います。ややこしいですね。 主には簡易なテストコードやサンプルコードを書く場合に使われるようです。 ただ、なぜ上記のコードがそのような動きになるのか解らなかったのでもう少し調べてみました。 * `__FILE__` ... 実行中のファイル名(相対パス)を返します。フルパスが必要な場合は File.expand_path(\_\_FILE\_\_) とする必要があります。 * `$0` ... 直接実行したファイル名(相対パス)を返します。 [こちらのコード](http://qiita.com/naoty_k/items/f84b2a9034a3bb3bfcb2)とほぼ同じですが、
# target_file.rb
puts "__FILE__ => #{__FILE__}"
puts "$0 => #{$0}"
if $0 == __FILE__
puts "Sample codeを実行"
else
puts "Sample codeは実行されない"
end
target_file.rb自体を直接実行すると、
$0
と__FILE__
に同じ値が入ることになるので、Sample codeが実行されます。
$ ruby target_file.rb
__FILE__ => filename.rb
$0 => filename.rb
Sample codeを実行
しかし、target_file.rbをライブラリとして使う(requireする)場合などは、`$0` と `__FILE__` の値が異なるので、Sample codeは実行されません。
# require_file.rb
require_relative 'target_file'
※ require_relative
とrequire
の違いについては別記事で説明します。
$ ruby require_file.rb
FILE => /tmp/target_file.rb
$0 => require_file.rb
Sample codeを実行しない
このようにライブラリなどを作る場合、if $0 == __FILE__
の分岐を入れることで
簡単にサンプルコードを記述することができます。