2010-02-12 11 views
84

Sono nuovo di Ruby. Sto cercando di importare le funzioni da un modulo che contiene uno strumento che voglio continuare a utilizzare separatamente. In Python vorrei semplicemente fare questo:`se __name__ == '__main __'` equivalente in Ruby

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

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

+0

possibile duplicato di [Esegui una libreria Ruby dalla riga di comando] (http://stackoverflow.com/questions/487086/run-a-ruby-library-from-the-commandline) –

risposta

111

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

EDIT:Found it.

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

Ma non è assolutamente comune.

+4

Qual è il ragionamento alla base del mantenimento moduli e script separati, per curiosità? – Imagist

+4

Penso che sia proprio quello che i Rubyisti preferiscono fare. Una definizione di modulo è una definizione di modulo. Se vuoi fare qualcosa con quel modulo, va bene, ma l'azione che stai compiendo * non è * una definizione del modulo. – Matchu

+7

È comodo, tuttavia, per testare le cose - è possibile inserire i test dei moduli lì ed eseguirli solo dal file del modulo senza alcun wrapper. – ebneter

8

Se la traccia dello stack è vuota, possiamo iniziare l'esecuzione a destra e a sinistra. Non so se sia usato convenzionalmente o non convenzionalmente visto che sono in Ruby da circa una settimana.

if caller.length == 0 
    # do stuff 
end 

Proof of concept:

di file: test.rb

#!/usr/bin/ruby                 

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

puts "Test" 

di file: shmest.rb

#!/usr/bin/ruby -I .                

require 'test.rb' 

puts "Shmest" 

Usage:

$ ./shmest.rb 
Test 
Shmest 

$ ./test.rb 
Main script 
Test