@Haulethの答えは正解です。Rubyにはmain
メソッドや構造はありません。ここでは、少し異なる見方と説明を提供したいと思います。
を実行するruby somefile.rb
と、Rubyは内のすべてのコードを実行しsomefile.rb
ます。したがって、非常に小さなプロジェクトがあり、それを1つのファイルに自己完結させたい場合は、次のようなことをしてもまったく問題はありません。
# somefile.rb
class MyClass
def say_hello
puts "Hello World"
end
end
def another_hello
puts "Hello World (from a method)"
end
c = MyClass.new
c.say_hello
another_hello
最初の2つのブロックが実行されないのではなく、対応するクラス/メソッドを実際に使用するまで効果が表示されないだけです。
このif __FILE__ == $0
ビットは、このファイルがコマンドラインから直接実行されている場合にのみ実行するコードをブロックする方法にすぎません。 __FILE__
は現在のファイルの名前であり$0
、シェルによって実行されたコマンドです(ただし、を削除するのに十分賢いですruby
)。したがって、2つを比較すると、次のことが正確にわかります。これはコマンドラインから実行されたファイルですか。これは、ファイルにクラス/モジュールを定義し、それを使用するコマンドラインユーティリティを提供したいコーダーによって行われることがあります。IMHOはあまり良いプロジェクト構造ではありませんが、他のプロジェクトと同じように、それを実行することが完全に理にかなっているユースケースがあります。
コードを直接実行できるようにしたい場合は、シバン行を追加できます
#!/usr/bin/env ruby
# rest of somefile.rb
そしてそれを実行可能にしますchmod +x somefile.rb
(オプションで.rb拡張子なしで名前を変更します)。これは実際には状況を変えません。if __FILE__ == $0
それでも機能し、おそらく必要ありません。
編集
@steenslagが正しく指摘しているように、Rubyの最上位スコープはObject
と呼ばれmain
ます。ただし、少しファンキーな動作があります。
irb
>> self
=> main
>> self.class
=> Object
>> main
NameError: undefined local variable or method `main' for main:Object
from (irb):8
言語をさらに深く掘り下げ始めるまで、これについて心配する必要はありません。この種のことについてもっと多くを学びたいのであれば、 Rubyのメタプログラミングは素晴らしい読み物です:)