`if __name__ == '__main __'` `odpowiednik w Rubim

101

Jestem nowy w Ruby. Chcę zaimportować funkcje z modułu zawierającego narzędzie, którego chcę nadal używać oddzielnie. W Pythonie zrobiłbym to po prostu:

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

Dzięki temu mogę uruchomić program lub zaimportować go jako moduł do użytku a()i / lub b()osobno. Jaki jest równoważny paradygmat w Rubim?

Imagista
źródło
możliwy duplikat Uruchom bibliotekę Ruby z wiersza poleceń
Andrew Grimm,
Możliwy duplikat Uruchom bibliotekę Ruby z wiersza poleceń
rogerdpack

Odpowiedzi:

130

Z Rubiego, który widziałem na wolności (oczywiście, nie jest to tona), to nie jest standardowy wzór Ruby. Moduły i skrypty powinny pozostać oddzielne, więc nie zdziwiłbym się, gdyby nie było na to dobrego, czystego sposobu.

EDYCJA: Znalazłem.

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

Ale to zdecydowanie nie jest powszechne.

Matchu
źródło
4
Jaki jest powód trzymania modułów i skryptów oddzielnie, z ciekawości?
Imagist
5
Myślę, że to właśnie preferują Rubiści. Definicja modułu to definicja modułu. Jeśli chcesz wykonać jakąś akcję z tym modułem, dobrze, ale akcja, którą wykonujesz, nie jest definicją modułu.
Matchu
8
Jest to jednak przydatne do testowania rzeczy - można tam umieścić testy modułów i uruchamiać je tylko z pliku modułu bez żadnego opakowania.
ebneter
3
@Imagist i @ebneter Lub odwrotnie: skrypt jest pojedynczym modułem, który ma być uruchamiany z wiersza poleceń, ale chcesz również móc przetestować go w częściach i mieć test w oddzielnym module. W takim przypadku NAZWA == $ 0 jest nieocenione.
Zamieszanie
16
Tego też nie widziałem, ale nie jest to mile widziane. Używają
cflewis
12

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

if caller.length == 0
  # do stuff
end

Dowód koncepcji:

plik: test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

plik: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

Stosowanie:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test
uKolka
źródło
1
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

jest preferowany przez Rubocopa nad tym:

if __FILE__ == $0
    foo()
    bar()
end
ablarg
źródło