2009-02-24 9 views
43

は、モジュールがは、主な機能を持っているを持っていないが、次のイディオムを使用することが一般的である:Rubyスクリプトでmainメソッドを定義すべきですか? Pythonで

def my_main_function(): 
    ... # some code 

if __name__=="__main__": # program's entry point 
    my_main_function() 

私はRubyはmainを持ってを持っていない知っています方法のどちらかですが、それに従うべきベストプラクティスがありますか?私の方法はmainなのかな?

Wikipedia page about main methodsは本当に私を助けません。サイドノートとして


は、私はまた、Pythonで、次のイディオムを見てきました:私は通常そうです、あなたができる

if __FILE__ == $0 
    x = SweetClass.new(ARGV) 
    x.run # or go, or whatever 
end 

を使用

def my_main_function(args=[]): 
    ... # some code 

if __name__=="__main__": # program's entry point 
    import sys 
    sys.exit(my_main_function(sys.argv)) 

答えて

74

。あなたがやっていることだけに依存します。

+2

- この方法、あなたのファイルスタンドアロンの実行可能ファイルとライブラリの両方として使用できます –

+0

+1クールです。私は、基本的に同じことに煮詰めた、より畳み込まれた方法を持っていました。私はこれでこれを置き換えます。 –

+0

ruby​​-profなどを使用している場合、条件は必要に応じて機能しません。 –

0

本当に効果がないために余分なレイヤーを追加するのはなぜですか?それを使用するRubyistsのための慣習はありません。

2回目の使用が必要になるまで待つことになります(考えられるよりも頻繁に起こることはありません)。そしてリファクタリングして再利用できるようにします。親指の

+4

あなたのファイルはライブラリとスクリプトの両方になるという利点があります。私はこのイディオムをいつも使っています。 – eremzeit

3

私の個人的なルールは次のとおりです。

if __FILE__ == $0 
    <some code> 
end 

は5行よりも長くなる瞬間、私はmain機能に展開します。これは、PythonとRubyの両方のコードに当てはまります。そのコードがなければ、構造が不十分に見えます。

46

私はいつも$PROGRAM_NAME$0よりも読みやすくなっています。そのような "Perlのような"グローバルを見ている時間の半分、私はそれらを見に行かなければなりません。


if __FILE__ == $PROGRAM_NAME 
    # Put "main" code here 
end 
8

ライブラリコードは、ライブラリコードが必要なlib /と実行ファイルにbin /に入れてください。これには、RubyGemsのパッケージングメソッドと互換性があるという追加の利点があります。

一般的なパターンは、libに/ application.rb(または好ましくは、ドメインのためのより適切な名前)を含み、ビン/アプリケーション、次のとおりです。これは良いアドバイスです

require 'application' 
Application.run(ARGV) 
+0

私はここで質問のポイントを逃したかもしれないと思う... – Perry

+0

これは素晴らしい答えです。スクリプトを./binに置き、 '#!/ usr/bin/env ruby​​'を先頭に追加してください。次に実行可能にする(chmod + x)と、あなたはよく整理され、理解しやすいものを持っています。 – mastaBlasta

関連する問題