if $0 == __FILE__のコードの意味

Posted by Tatsuyano on Thu, Mar 26, 2015
In
Tags ruby

最近こちらの記事を読んでいて、 以下のコードの意味が解らなかったので調べてみました。

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_relativerequireの違いについては別記事で説明します。

$ ruby require_file.rb
FILE =>  /tmp/target_file.rb
$0       =>  require_file.rb
Sample codeを実行しない

このようにライブラリなどを作る場合、if $0 == __FILE__の分岐を入れることで 簡単にサンプルコードを記述することができます。

参考サイト