ruby main-method

¿Debo definir un método principal en mis scripts de ruby?



main-method (5)

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 sea más apropiado para su dominio) y bin / application, que contiene:

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

En Python, un módulo no tiene que tener una función principal, pero es una práctica común utilizar la siguiente expresión idiomática:

def my_main_function(): ... # some code if __name__=="__main__": # program''s entry point my_main_function()

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

La página de Wikipedia sobre métodos principales realmente no me ayuda.

Como nota al margen, también he visto el siguiente modismo 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))


Mi regla de oro personal es: el momento

if __FILE__ == $0 <some code> end

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


No.

¿Por qué agregar una capa adicional de complejidad sin ningún beneficio real? No hay convención para los Rubyistas 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 lo refactorizará para que sea reutilizable, lo que probablemente implicará una construcción como la anterior.


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


Usualmente uso

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

Entonces sí, puedes. Solo depende de lo que estás haciendo.