下記は、greet
メソッドだけを持つ簡単なクラスです。
class Hello
def greet; puts 'Hello!'; end
end
obj = Hello.new
obj.greet
一見何の問題もないように見えますが、グローバルなスコープに実行可能なメインロジックが含まれているため、下記のような問題があります。
require_once
で読み込んだときにメインロジックが実行されてしまうこれを防ぐには、下記のようにメインロジックを if $0 == __FILE__
という条件で囲んでやります。
class Hello
def greet; puts 'Hello!'; end
end
if $0 == __FILE__
obj = Hello.new
obj.greet
end
こうしておくと、ruby hello.rb
としたときだけメインロジックが実行され、別のファイルから require_relative
で読み込まれた場合には実行されないようになります。
$0
の値は ruby
コマンドに渡したファイル名になり、__FILE__
の値は記述されているスクリプトファイル自身の名前になるため、上記のようにしておけば、別ファイル経由で require_relative
した場合に、条件式が一致しなくなるという仕組みです。
実行するコマンド | $0 の値 |
__FILE__ の値 |
---|---|---|
ruby hello.rb |
hello.rb | hello.rb |
ruby other.rb |
other.rb | hello.rb |
Ruby だけでなく、Perl や Python など、他のスクリプト言語でもほぼ同様の書き方をします。