`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?

Imagista
fonte
possível duplicata de Executar uma biblioteca Ruby na linha de comando
Andrew Grimm
Possível duplicata de Executar uma biblioteca Ruby na linha de comando
rogerdpack

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.

Matchu
fonte
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
uKolka
fonte
1
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

é preferido por Rubocop sobre este:

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