2009-02-24 21 views
43

en Python, un módulo no tiene tener una función principal, pero es una práctica común utilizar el siguiente idioma:¿Debo definir un método principal en mis scripts de ruby?

def my_main_function(): 
    ... # some code 

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

Sé que Ruby no han tener un main método tampoco, pero ¿hay algún tipo de mejor práctica que debería seguir? ¿Debería nombrar mi método main o algo así?

El Wikipedia page about main methods realmente no me ayuda.


Como nota lateral, también he visto la siguiente expresión idiomática en Python:

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

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

Respuesta

74

normalmente utilizo

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

Así que sí, se puede. Solo depende de lo que estás haciendo.

+2

Este es un buen consejo - de esta manera, su archivo se puede utilizar como un ejecutable independiente y como una biblioteca –

+0

+1 genial. Tenía una forma más intrincada de hervir hasta básicamente lo mismo. Lo reemplazaré con esto. –

+0

El condicional no funciona como se desea si está usando ruby-prof o similar. –

0

¿Por qué añadir una capa adicional de complejidad para ningún beneficio real? No hay convención para los Rubyists que lo usan.

Esperaría hasta la segunda vez que necesite usarlo (lo que probablemente ocurrirá con menos frecuencia de lo que cree) y luego refactorizarlo para que sea reutilizable, lo que probablemente implicará una construcción como la anterior.

+4

La ventaja es que su archivo puede ser tanto una biblioteca como un script. Uso este idioma todo el tiempo. – eremzeit

3

Mi regla de oro es personal: el momento

if __FILE__ == $0 
    <some code> 
end 

obtiene más de 5 líneas, extraigo a main función. Esto es válido tanto para Python como para el código de Ruby. Sin ese código solo se ve mal estructurado.

46

Siempre he encontrado $PROGRAM_NAME más legible que usando $0. La mitad de las veces que veo los globals "similares a Perl", tengo que ir a buscarlos.


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

Debe poner el código de la biblioteca en lib/y ejecutables, que requieren código de biblioteca, en bin /. Esto tiene la ventaja adicional de ser compatible con el método de empaquetado de RubyGems.

Un patrón común es lib/application.rb (o, preferiblemente, un nombre que es más apropiado para su dominio) y bin/aplicación, que contiene:

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

Creo que se ha perdido el sentido de la pregunta aquí ... – Perry

+0

Esta es una respuesta excelente. Coloque su script en ./bin y agregue '#!/Usr/bin/env ruby' a la parte superior. Luego hágalo ejecutable (chmod + x) y tendrá algo bien organizado y fácil de entender. – mastaBlasta

Cuestiones relacionadas