`if __name__ == '__main __'` equivalente en Ruby

101

Soy nuevo en Ruby. Estoy buscando importar funciones de un módulo que contiene una herramienta que quiero seguir usando por separado. En Python simplemente haría esto:

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

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

Imagist
fuente

Respuestas:

130

Desde el Ruby que he visto en la naturaleza (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 permanecer separados, por lo que no me sorprendería que no haya una forma realmente buena y limpia de hacer esto.

EDITAR: Lo encontré.

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

Pero definitivamente no es común.

Matchu
fuente
4
¿Cuál es el razonamiento detrás de mantener los módulos y los scripts separados, por curiosidad?
Imagist
5
Creo que es justo lo que prefieren hacer los rubyists. Una definición de módulo es una definición de módulo. Si desea realizar alguna acción con ese módulo, está bien, pero la acción que está realizando no es una definición de módulo.
Matchu
8
Sin embargo, es útil para probar cosas: puede poner pruebas de módulo allí y ejecutarlas solo desde el archivo del módulo sin ningún contenedor.
ebneter
3
@Imagist y @ebneter O al revés: el script es un módulo único que está diseñado para ejecutarse desde la línea de comandos, pero también desea poder probarlo en partes y tener la prueba en un módulo separado. En ese caso, NAME == $ 0 es invaluable.
Confusión
16
Tampoco he visto esto, pero no está mal visto. Los documentos oficiales de Ruby lo usan: ruby-lang.org/en/documentation/quickstart/4
cflewis
12

Si el seguimiento de la pila está vacío, podemos comenzar a ejecutar a derecha e izquierda. No sé si se usa de manera 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
uKolka
fuente
1
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

es preferido por Rubocop sobre esto:

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