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


101

Eu sou novo em Ruby. Estou procurando importar funções de um módulo que contém uma ferramenta que desejo continuar usando separadamente. Em Python, eu simplesmente faria isso:

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

Isso me permite executar o programa ou importá-lo como um módulo para usar a()e / ou b()separadamente. Qual é o paradigma equivalente em Ruby?



Respostas:


130

Do Ruby que vi em liberdade (concordo, não uma tonelada), este não é um padrão de design Ruby padrão. Os módulos e scripts devem permanecer separados, então eu não ficaria surpreso se não houvesse realmente uma maneira limpa e boa de fazer isso.

EDIT: Encontrei.

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

Mas definitivamente não é comum.


4
Qual é o raciocínio por trás de manter módulos e scripts separados, por curiosidade?
Imagist

5
Acho que é exatamente o que os rubistas preferem fazer. Uma definição de módulo é uma definição de módulo. Se você deseja realizar alguma ação com esse módulo, tudo bem, mas a ação que você está realizando não é uma definição de módulo.
Matchu

8
É útil, no entanto, para testar coisas - você pode colocar testes de módulo lá e executá-los apenas a partir do arquivo de módulo sem qualquer invólucro.
ebneter

3
@Imagist e @ebneter Ou vice-versa: o script é um único módulo que se destina a ser executado a partir da linha de comando, mas você também deseja poder testá-lo em partes e ter o teste em um módulo separado. Nesse caso, NAME == $ 0 é inestimável.
Confusão

16
Eu também não vi isso, mas não é desaprovado. Os documentos oficiais do Ruby o usam: ruby-lang.org/en/documentation/quickstart/4
cflewis

12

Se o rastreamento da pilha estiver vazio, podemos começar a executar à direita e à esquerda. Não sei se isso é usado de forma convencional ou não convencional, já que estou no Ruby há cerca de uma semana.

if caller.length == 0
  # do stuff
end

Prova de conceito:

arquivo: test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

arquivo: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

Uso:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test

1
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

é preferido por Rubocop sobre este:

if __FILE__ == $0
    foo()
    bar()
end
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.