2009-02-24 11 views
43

In Python, hat ein Modul nicht eine Hauptfunktion haben, aber es ist üblich, folgendes Idiom zu verwenden:Sollte ich eine Hauptmethode in meinen Ruby-Skripten definieren?

def my_main_function(): 
    ... # some code 

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

ich Rubin nicht weiß eine main zu haben haben Methode, aber gibt es eine Art von Best Practice, die ich befolgen sollte? Sollte ich meine Methode main oder etwas benennen?

Die Wikipedia page about main methods hilft mir nicht wirklich.

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

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

Antwort

74

ich in der Regel

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

Also ja, können Sie verwenden:


Als Randbemerkung, ich habe auch das folgende Idiom in Python zu sehen. Es hängt nur davon ab, was Sie tun.

+2

Dies ist guter Rat - auf diese Weise, Ihre Datei ist sowohl als eigenständige ausführbare Datei als auch als Bibliothek –

+0

+1 cool verwendbar. Ich hatte einen komplizierteren Weg, der im Grunde dasselbe war. Ich werde es damit ersetzen. –

+0

Die Bedingung funktioniert nicht wie gewünscht, wenn Sie Ruby-Prof oder dergleichen verwenden. –

0

Nr

Warum für keinen wirklichen Vorteil eine zusätzliche Schicht von Komplexität? Es gibt keine Konvention für Rubyists, die es benutzen.

Ich würde bis zum zweiten Mal warten, dass Sie es verwenden müssen (was wahrscheinlich seltener passieren wird, als Sie denken) und es dann refaktorieren, so dass es wiederverwendbar ist, was wahrscheinlich ein Konstrukt wie das obige beinhalten wird.

+4

Der Vorteil ist, dass Ihre Datei sowohl eine Bibliothek als auch ein Skript sein kann. Ich benutze diese Redewendung die ganze Zeit. – eremzeit

3

Meine persönliche Faustregel: der Moment

if __FILE__ == $0 
    <some code> 
end 

länger wird als 5 Zeilen, ich entpacken Sie es in main Funktion. Dies gilt sowohl für Python- als auch für Ruby-Code. Ohne diesen Code sieht es nur schlecht strukturiert aus.

46

Ich habe immer $PROGRAM_NAME besser lesbar als mit $0 gefunden. Die Hälfte der Zeit, in der ich die "Perl-ähnlichen" Globals so sehe, muss ich nachschlagen.

8

Sie sollten Bibliothekscode in lib/und ausführbare Dateien, die Bibliothekscode erfordern, in bin/ablegen. Dies hat den zusätzlichen Vorteil, dass es mit der Packaging-Methode von RubyGems kompatibel ist.

Ein übliches Muster ist lib/application.rb (oder vorzugsweise ein Name, der besser geeignet für Ihre Domain ist) und ist/Anwendung, die enthält:

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

Ich denke, Sie haben den Punkt der Frage hier vielleicht verpasst ... – Perry

+0

Dies ist eine ausgezeichnete Antwort. Platziere dein Skript in ./bin und füge '#!/Usr/bin/env ruby' an die Spitze hinzu. Dann mach es ausführbar (chmod + x) und du hast etwas, das gut organisiert und leicht zu verstehen ist. – mastaBlasta