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


101

Sono nuovo su Ruby. Sto cercando di importare funzioni da un modulo che contiene uno strumento che voglio continuare a utilizzare separatamente. In Python farei semplicemente questo:

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

Questo mi permette di eseguire il programma o importarlo come modulo da utilizzare a()e / o b()separatamente. Qual è il paradigma equivalente in Ruby?



Risposte:


130

Dal Ruby che ho visto in natura (garantito, non una tonnellata), questo non è un modello di design Ruby standard. I moduli e gli script dovrebbero rimanere separati, quindi non sarei sorpreso se non ci fosse davvero un modo buono e pulito per farlo.

EDIT: Trovato.

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

Ma sicuramente non è comune.


4
Qual è il ragionamento dietro a tenere separati moduli e script, per curiosità?
Imagist

5
Penso che sia proprio quello che i Rubyists preferiscono fare. Una definizione di modulo è una definizione di modulo. Se vuoi intraprendere un'azione con quel modulo, va bene, ma l'azione che stai eseguendo non è una definizione del modulo.
Matchu

8
È utile, tuttavia, per testare le cose: puoi inserire i test del modulo lì ed eseguirli solo dal file del modulo senza alcun wrapper.
ebneter

3
@Imagist e @ebneter O viceversa: lo script è un singolo modulo che deve essere eseguito dalla riga di comando, ma vuoi anche essere in grado di testarlo in parti e avere il test in un modulo separato. In tal caso, NAME == $ 0 è inestimabile.
Confusione

16
Non l'ho visto neanche questo, ma non è disapprovato. I documenti ufficiali di Ruby lo usano: ruby-lang.org/en/documentation/quickstart/4
cflewis

12

Se la traccia dello stack è vuota, possiamo iniziare l'esecuzione a destra ea sinistra. Non so se sia usato in modo convenzionale o non convenzionale dato che sono in Ruby per circa una settimana.

if caller.length == 0
  # do stuff
end

Verifica teorica:

file: test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

file: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

Utilizzo:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test

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

è preferito da Rubocop rispetto a questo:

if __FILE__ == $0
    foo()
    bar()
end
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.