A.8.4.3. Spustitelný kód v knihovnách

Když napíšeme skript, a ten chceme používat jednak jako program a pak jako knihovnu, potřebujeme mechanizmus jak zajistit odlišné chování v obou případech. Při načtení jako knihovny jiným skriptem příkazem require 'moje_knihovna' potřebujeme aby se nevykonával žádný kód, a naopak při přímém spuštění

$ ./moje_knihovna

potřebujeme kód vykonat. Takto odlišné chování v obou případech zajistíme touto konstrukcí přidanou na konec souboru

if $0 == __FILE__ 1
    # kód se provede jen při přímém spuštění
    # například:
    run_test
end
1 Podmínka je splněna je tehdy, pokud je jméno spuštěného programu/skriptu ($0) shodné se jménem soubor v němž se nachází (__FILE__).

A k čemu že je to dobré? Například je náš velký program rozdělen do řady menších souborů. V každém jsou související metody a třídy. Při spuštění programu se jednotlivé soubory jen načítají, zatímco když spustíme každy soubor samostatně, provedou se testy funkčnosti v něm naprogramované.

Více v testování, konkrétně „Primitivní testy“.

Máme-li soubor s definicí nějakých objektů, který používáme jako knihovnu, potřebujeme do něj někdy umístnit výkonný kód. Jde o to, že se soubor chová jinak když jej nahráváme pomocí require 'soubor.rb' z jiného souboru a jinak když jej přímo spustíme

$ ./soubor.rb

Toto odlišné chování zajistíme přidáním kódu s podmínkou na konce souboru. Vypadá to nějak takto

if $0 == __FILE__
    # kód který se provede, například spuštění testovací metody
    test
end

Úplný spustitelný příklad

#!/usr/bin/env ruby
# $Id: hello-arun.rb,v 1.1 2002/10/06 09:23:58 radek Exp $
# $Source: /home/radek/cvs/ruby-book/example/misc/hello-arun.rb,v $

def hello
    puts "Hello, world."
end

if $0 == __FILE__
    hello
end
Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .