2010-02-12 9 views
84

Jestem nowy w Ruby. Szukam importowania funkcji z modułu, który zawiera narzędzie, które chcę dalej używać osobno. W Pythonie chciałbym po prostu to zrobić:`jeśli __name__ == '__main __'` odpowiednik w Ruby

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

To pozwala mi uruchomić program lub zaimportować go jako moduł do korzystania a() i/lub b() oddzielnie. Jaki jest równoważny paradygmat w Ruby?

+0

możliwy duplikat [Uruchom bibliotekę Ruby z wiersza poleceń] (http://stackoverflow.com/questions/487086/run-a-ruby-library-from-the-command-line) –

Odpowiedz

111

Z rubinu, który widziałem na wolności (przyznany, nie tonę), nie jest to standardowy wzór Ruby. Moduły i skrypty mają pozostać oddzielne, więc nie zdziwiłbym się, gdyby nie było naprawdę dobrego, czystego sposobu robienia tego.

EDIT:Found it.

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

Ale na pewno nie jest powszechne.

+4

Co to jest uzasadnienie utrzymania moduły i skrypty oddzielają się od ciekawości? – Imagist

+4

Myślę, że właśnie to preferują Rubyists. Definicja modułu jest definicją modułu. Jeśli chcesz podjąć pewne działanie z tym modułem, dobrze, ale akcja, którą robisz * nie jest * definicją modułu. – Matchu

+7

Przydaje się jednak do testowania rzeczy - możesz tam testować moduły i uruchamiać je z pliku modułu bez opakowania. – ebneter

8

Jeśli ślad stosu jest pusty, możemy rozpocząć wykonywanie w prawo iw lewo. Nie wiem, czy to jest używane konwencjonalnie, czy niekonwencjonalnie, ponieważ jestem w Ruby przez około tydzień.

if caller.length == 0 
    # do stuff 
end 

Dowód koncepcji:

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" 

Zastosowanie:

$ ./shmest.rb 
Test 
Shmest 

$ ./test.rb 
Main script 
Test 
Powiązane problemy