私はRubyを初めて使用するので、これが本当にばかげているように聞こえるのであればおologiesびします。
「メイン」コードを記述し、同じファイルにメソッドを含める方法を理解できないようです(Cに似ています)。最終的に、すべてのメソッドを備えた別個のファイルをロードする「メイン」ファイルになります。これに関するガイダンスを感謝します。
私は次のSO postを見つけましたが、それを理解していません: メインのメソッドを定義する必要がありますRuby scripts?
大したことではありませんが、同じファイル内のすべての関連コードを簡単に見ることができます。ありがとうございました。
[-編集-]
応答したすべての人に感謝します-コードの上にすべてのメソッドを定義するだけでよいことがわかります。以下に例を示します。
def callTest1
puts "in test 1"
end
def callTest2
puts "in test 2"
end
callTest1
callTest2
Rubyは事前にすべてのメソッドを知る必要がある。これはCとは異なり、利用可能な関数を明確にリストするヘッダーファイルがあり、main()の下で定義できる)関数
繰り返しになりますが、回答いただいた皆様に感謝します。
@Haulethの答えは正しいです。Rubyにはmain
メソッドや構造はありません。ここで、いくつかの説明とともに、少し異なるビューを提供したいと思います。
Ruby somefile.rb
を実行すると、Rubyはsomefile.rb
内のすべてのコードを実行します。ファイル、このようなことをするのは絶対に悪いことではありません:
# 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つを比較すると正確にわかりますそれ:これはコマンドラインから実行されたファイルですか?これは、ファイルでクラス/モジュールを定義し、それを使用するコマンドラインユーティリティを提供するコーダーによって実行される場合があります。私見はあまり良いプロジェクト構造ではありませんが、それがそうであるように、それが完全に理にかなっているユースケースがあります。
コードを直接実行したい場合は、 Shebang 行を追加できます
#!/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
言語をさらに深く掘り始めるまで、これについて心配する必要はありません。あなたがdoこの種のことについてもっと学びたいなら、 Metaprogramming Ruby は素晴らしい読み物です:)
いいえ、そのような構造はありません。もちろん、メイン関数を定義することはできますが、定義するまで呼び出されません。 Ruby行ごとに実行するため、「Hello World」を印刷する場合は、次のように記述します。
puts 'Hello World'
あなたが言及した質問は、モジュールと実行可能ファイルとして1つのファイルを使用することに関するものです。
if __FILE__ == $0
# your code
end
このファイルを実行した場合にのみ呼び出されます。他のファイルでのみ必要な場合、このコードは実行されません。しかし、私見ではそれは悪い考えです、より良いオプションはRubyGemsを使用し、そこで実行可能ファイルを追加することです。
実際にはmain
がありますが、メソッドではありません。 Rubyプログラムの最初の実行コンテキストである最上位オブジェクトです。
class Foo
p self
end
#=> Foo
p self
#=> main
def foo
p self
end
foo
#=> main
Rubyには魔法の主な機能はありません。 http://en.wikipedia.org/wiki/Main_function#Ruby を参照してください
Cコンパイル済みファイルのようなRubyスクリプトを実行する場合は、次の手順を実行します。
#!/usr/bin/env Ruby
puts "Hello"
その後 chmod a+x file_name.rb
。 Cのmain
の内容であるかのように、最初の行の下にあるすべてが実行されます。もちろん、クラスおよび関数定義は、インスタンス化/起動されるまで結果を提供しません(ただし、内部のコードクラス定義は実際に評価されるため、出力を得ることができますが、これは通常の状況では想定されていません)。