web-dev-qa-db-ja.com

CのようなRubyに「main」メソッドはありますか?

私は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()の下で定義できる)関数

繰り返しになりますが、回答いただいた皆様に感謝します。

37
rchn

@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 は素晴らしい読み物です:)

37
dantswain

いいえ、そのような構造はありません。もちろん、メイン関数を定義することはできますが、定義するまで呼び出されません。 Ruby行ごとに実行するため、「Hello World」を印刷する場合は、次のように記述します。

puts 'Hello World'

あなたが言及した質問は、モジュールと実行可能ファイルとして1つのファイルを使用することに関するものです。

if __FILE__ == $0
  # your code
end

このファイルを実行した場合にのみ呼び出されます。他のファイルでのみ必要な場合、このコードは実行されません。しかし、私見ではそれは悪い考えです、より良いオプションはRubyGemsを使用し、そこで実行可能ファイルを追加することです。

22
Hauleth

実際にはmainがありますが、メソッドではありません。 Rubyプログラムの最初の実行コンテキストである最上位オブジェクトです。

class Foo
  p self
end
#=> Foo

p self
#=> main

def foo 
  p self
end
foo
#=> main
6
steenslag

Rubyには魔法の主な機能はありません。 http://en.wikipedia.org/wiki/Main_function#Ruby を参照してください

1
Alexander

Cコンパイル済みファイルのようなRubyスクリプトを実行する場合は、次の手順を実行します。

#!/usr/bin/env Ruby
puts "Hello"

その後 chmod a+x file_name.rb。 Cのmainの内容であるかのように、最初の行の下にあるすべてが実行されます。もちろん、クラスおよび関数定義は、インスタンス化/起動されるまで結果を提供しません(ただし、内部のコードクラス定義は実際に評価されるため、出力を得ることができますが、これは通常の状況では想定されていません)。

1
Aleksander Pohl