2009-02-24 11 views
43

in Python, un modulo non lo fa ha avere una funzione principale, ma è pratica comune utilizzare la seguente forma:Devo definire un metodo principale nei miei script ruby?

def my_main_function(): 
    ... # some code 

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

So Ruby non hanno avere un main metodo, ma c'è una sorta di best practice che dovrei seguire? Devo chiamare il mio metodo main o qualcosa del genere?

Il Wikipedia page about main methods non mi aiuta veramente.


Come un lato nota, ho anche visto il seguente idioma in python:

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

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

risposta

74

Io di solito uso

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

Quindi sì, è possibile. Dipende solo da cosa stai facendo.

+2

Questo è un buon consiglio - in questo modo, il file è utilizzabile sia come eseguibile standalone che come libreria –

+0

+1 cool. Ho avuto un modo più contorto di ridurre sostanzialmente la stessa cosa. Lo sostituirò con questo. –

+0

Il condizionale non funziona come desiderato se stai usando ruby-prof o simili. –

0

No.

Perché aggiungere un ulteriore livello di complessità senza alcun beneficio reale? Non c'è convenzione per i Rubyists che la usano.

Aspetterei la seconda volta che è necessario utilizzarlo (che probabilmente accadrà meno spesso di quanto si pensi) e quindi refactarlo in modo che sia riutilizzabile, il che probabilmente coinvolgerà un costrutto come il precedente.

+4

Il vantaggio è che il file può essere sia una libreria che uno script. Uso questo idioma tutto il tempo. – eremzeit

3

La mia regola personale generale è: il momento

if __FILE__ == $0 
    <some code> 
end 

ottiene più di 5 righe, ho estratto a main funzione. Questo vale per il codice Python e Ruby. Senza quel codice sembra solo strutturato male.

46

Ho sempre trovato $PROGRAM_NAME più leggibile rispetto all'utilizzo di $0. La metà delle volte che vedo i globali "Perl-like" del genere, devo andare a cercarli.

8

È necessario inserire il codice libreria in lib/ed eseguibili, che richiedono il codice libreria, in bin /. Questo ha l'ulteriore vantaggio di essere compatibile con il metodo di imballaggio di RubyGems.

Un modello comune è lib/application.rb (o, preferibilmente, un nome che è più appropriato per il tuo dominio) e bin/applicazione, che contiene:

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

Penso che tu abbia perso il punto della domanda qui ... – Perry

+0

Questa è una risposta eccellente. Metti il ​​tuo script in ./bin e aggiungi '#!/Usr/bin/env ruby' all'inizio. Quindi rendilo eseguibile (chmod + x) e hai qualcosa che è ben organizzato e facile da capire. – mastaBlasta

Problemi correlati