Help us understand the problem. What is going on with this article?

[Ruby] if __FILE__ == $0 ってなんなの!?

なぜこの記事を書いたのかしら?

ライブラリのソースコードを読んでいる時や、会社で他の人が書いたコードを読んでいるときに、次のような記述が書かれているのを見たことはないかしら。
if __FILE__ == $0(もしくはif $0 == __FILE__)

この記事では初学者向けの本には絶対書かれてはいないであろうこのフシギな記述の意味について解説するわ。

結論から言っちゃうと...

こんな気持ち悪い文体の記事を長々と読んでられないって子猫ちゃんたちのためにざっくり結論から言うわ。

「このスクリプトが直接実行された時だけこの処理を実行しなさい。」

はい、これで分かったわね?分かったお利口ちゃん達はここで読むのをやめてコードリーディングに励みなさい。
分からなかった子猫ちゃん達は...安心して、じっくり解説してあげるわ。

各変数の意味

全体を見ると全くワケの分からない記述だけどちゃんと一つ一つ分解して考えましょう。

要は__FILE__$0が一致した時に実行されるわけね。

この__FILE__擬似変数って呼ばれる特殊な変数の一種なの。他にはnilとか真偽値のtrueとかfalseなんかもRubyでは擬似変数っていう扱いね。

で、この__FILE__って擬似変数は実行中のファイル名を表すの。

test.rb
puts __FILE__ # => test.rb

じゃあ次は$0ちゃんよ。
$0ちゃんは特殊変数ってくくりの変数なの。詳しい違いは...参考文献を読んでね!

意味は現在実行中のファイルのファイル名よ。

・・・

同じじゃない!いや、違うの!やめて、殴らないで!
殴る前に参考のコードを見てちょうだい!

test.rb
puts __FILE__ # => test.rb
puts $0 # => test.rb

...まだ待ってちょうだいね。

test2.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のコードの意味

Kanezoh
大学生 Rubyをさわさわします
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした