2010-02-12 28 views
84

Soy nuevo en Ruby. Estoy buscando importar funciones de un módulo que contiene una herramienta que quiero seguir usando por separado. En Python yo simplemente hacer esto:`if __name__ == '__main __'` equivalente en Ruby

def a(): 
    ... 
def b(): 
    ... 
if __name__ == '__main__': 
    a() 
    b() 

Esto me permite ejecutar el programa o la importación como un módulo para utilizar a() y/o b() por separado. ¿Cuál es el paradigma equivalente en Ruby?

+0

posible duplicado de [Ejecutar una biblioteca de Ruby desde la línea de comandos] (http://stackoverflow.com/questions/487086/run-a-ruby-library-from-the-command-line) –

Respuesta

111

Desde el Ruby que he visto en libertad (concedido, no una tonelada), este no es un patrón de diseño estándar de Ruby. Se supone que los módulos y los scripts deben mantenerse separados, por lo que no me sorprendería que no exista una forma buena y limpia de hacerlo.

EDIT:Found it.

if __FILE__ == $0 
    foo() 
    bar() 
end 

Pero definitivamente no es común.

+4

¿Cuál es el razonamiento detrás de mantener módulos y scripts separados, por curiosidad? – Imagist

+4

Creo que es justo lo que los Rubyistas prefieren hacer. Una definición de módulo es una definición de módulo. Si quiere tomar alguna medida con ese módulo, está bien, pero la acción que está tomando * no es * una definición de módulo. – Matchu

+7

Sin embargo, es útil para probar cosas: puede poner pruebas de módulo ahí y ejecutarlas solo desde el archivo del módulo sin envoltorio. – ebneter

8

Si el seguimiento de la pila está vacío, podemos comenzar a ejecutar a la derecha e izquierda. No sé si se usa de forma convencional o no convencional ya que estoy en Ruby durante aproximadamente una semana.

if caller.length == 0 
    # do stuff 
end 

Prueba de concepto:

archivo: test.rb

#!/usr/bin/ruby                 

if caller.length == 0 
    puts "Main script" 
end 

puts "Test" 

archivo: shmest.rb

#!/usr/bin/ruby -I .                

require 'test.rb' 

puts "Shmest" 

Uso:

$ ./shmest.rb 
Test 
Shmest 

$ ./test.rb 
Main script 
Test