なぜこの記事を書いたのかしら?
ライブラリのソースコードを読んでいる時や、会社で他の人が書いたコードを読んでいるときに、次のような記述が書かれているのを見たことはないかしら。
if __FILE__ == $0
(もしくはif $0 == __FILE__
)
この記事では初学者向けの本には絶対書かれてはいないであろうこのフシギな記述の意味について解説するわ。
結論から言っちゃうと...
こんな気持ち悪い文体の記事を長々と読んでられないって子猫ちゃんたちのためにざっくり結論から言うわ。
「このスクリプトが直接実行された時だけこの処理を実行しなさい。」
はい、これで分かったわね?分かったお利口ちゃん達はここで読むのをやめてコードリーディングに励みなさい。
分からなかった子猫ちゃん達は...安心して、じっくり解説してあげるわ。
各変数の意味
全体を見ると全くワケの分からない記述だけどちゃんと一つ一つ分解して考えましょう。
要は__FILE__
と$0
が一致した時に実行されるわけね。
この__FILE__
は擬似変数って呼ばれる特殊な変数の一種なの。他にはnil
とか真偽値のtrue
とかfalse
なんかもRubyでは擬似変数っていう扱いね。
で、この__FILE__
って擬似変数は実行中のファイル名を表すの。
puts __FILE__ # => test.rb
じゃあ次は$0
ちゃんよ。
$0
ちゃんは特殊変数ってくくりの変数なの。詳しい違いは...参考文献を読んでね!
意味は現在実行中のファイルのファイル名よ。
・・・
同じじゃない!いや、違うの!やめて、殴らないで!
殴る前に参考のコードを見てちょうだい!
puts __FILE__ # => test.rb
puts $0 # => test.rb
...まだ待ってちょうだいね。
require_relative './test.rb'
ruby test2.rb
# => test.rb
# => test2.rb
ほら!結果が変わったでしょ!
こんな感じで実行中のファイル名の変数ってところは同じだけど
__FILE__
は**__FILE__ が書いてあるファイルのファイル名**、
$0ちゃんは文字通り、現在実行中、つまり直接実行したファイルのファイル名を指すの。分かったかしら?
結論
上記を踏まえるとif __FILE__ == $0
の意味は
直接実行したファイルのファイル名とこのスクリプトのファイル名が一致する時だけ処理を実行しなさいということね。
まあめっちゃくちゃ簡単に言っちゃうとrequireとかで他から使うときは実行しない処理ってことよ。
用途は他からrequireされることが前提のスクリプトの簡単なテストを書くときとかに使うわね。
あとは書き捨てのスクリプトで明示的に、「ここがmainの処理ですよ〜」ってのを示す時に使うわ。
意外と使えるし、なんかRuby通っぽさが出るから積極的に使うといいわ、ただこの記述自体の意味と使った理由はちゃんと説明できるようにしておきなさいね、約束よ。
参考文献
Ruby 2.7.0 リファレンスマニュアル 変数と定数
Ruby 2.7.0 リファレンスマニュアル ライブラリ一覧 組み込みライブラリ Kernelモジュール
if $0 == __FILE__のコードの意味