IRB tippek

2008-08-18 01:51 | kommentek

Fejlesztés közben sokszor előfordul, hogy ki szeretnénk próbálni valami új gemet, letesztelni egy osztály működését, vagy csak felfedező körútra indulnánk. Ilyenkor a legjobb nyitni egy terminált és indítani egy IRB promptot. Jól beállítva és helyesen kezelve a Ruby programozó leghasznosabb eszköze lehet. Az alábbiakban adok pár tippet, amivel még hatékonyabban tudjuk használni a programot.

Aki esetleg nem ismerné, hogy mi is ez az egész: az IRB az Interaktív Ruby Shell rövidítése. Elindítás után egy promptot kapunk. Írjunk ide valamilyen Ruby kifejezést, és nyomjunk entert. Azonnal meg is kapjuk a kifejezés értékét. Itt minden megengedett, ami amúgy a Rubyban az. Betölthetünk külső könyvtárakat, írhatunk komplett osztályokat és modulokat, egyszóval mindent.

>> 1+3
=> 4
>> "chunky bacon".split
=> ["chunky", "bacon"]
>> 3.14.class
=> Float

.irbrc, Wirble

Itt jön a fontos rész. Az IRB induláskor megnézi, hogy van-e a $HOME könyvtárunkban egy .irbrc nevű fájl. Ha van, akkor ezt betölti. Mivel maga az IRB is egy Ruby osztály, ami kezeli a program futását, ezért természetesen az .irbrc fájl is egy ruby szkript. Minden amit itt csinálunk, az le fog futni az IRB indulása előtt. Első és legfontosabb tipp:

require 'rubygems'

Innentől kezdve nem kell mindig kiadnunk ezt a parancsot, ha egy gemet szeretnénk használni. A következő lépés a Wirble gem telepítése. Ez olyan további hasznos dolgokkal egészíti ki az IRB-t, mint például history, tab-completion és a visszatérési értékek színezése. Ha fent van, akkor a fenti sorhoz a következőket lehet még hozzáadni:

require 'wirble'
Wirble.init
Wirble.colorize

Az utolsó sor nem is szükséges, ha nem szeretnénk színes IRB-t.

Hol van definiálva?

Tovább fejleszthetjük az .irbrc fájlunk a Unix rendszerekből ismerős which parancshoz hasonló metódussal. A "Where is this defined?" metódus segítségével egy blokkon belüli metódushívásból el tudjuk dönteni, hogy az adott metódus hol van definiálva (a példában which-re aliasolva).

>> which { Time.zone }
=> "ActiveSupport::CoreExtensions::Time::Zones::ClassMethods received message 'zone', Line #14 of /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/core_ext/time/zones.rb"
>> which { [].map(&:name) }
=> "Symbol received message 'to_proc', Line #10 of /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/core_ext/symbol.rb"

Az utolsó példából az is látszik, hogy a metódus bonyolultabb kifejezésekkel is megbírkózik. Néha azonban előfordul, hogy nem pont azt találja meg, amit keresünk, vagy éppen nem talál semmit. Mindenesetre néha hasznos tud lenni.

String#to_proc

A Rails ActiveSupport moduljából ismerős lehet a Symbol#to_proc metódus, aminek a segítségével könnyen tudunk iterációkat írni.

users.select(&:active?).collect(&:email)

Ennél sokkal rugalmasabb Reginald Braithwaite String#to_proc implementációja. Pár példa, hogy mikre képes (bővebb bemutatót a hivatkozott blogbejegyzésben láthattok):

(1..5).map &'*2'   # => [2, 4, 6, 8, 10]
(1..5).inject &'+' # => 15
users.map &'.albums.first.title'

Az általam jelenleg használt .irbrc fájl tartalmazza az összes említett feature-t. Megtekinthető és letölthető Gistről. Használjátok kedvetek szerint.

Utility Belt

Korábban már hallottam egy Wirble-nél még több mindenre képes IRB enhancement gemről, aminek Utility Belt a neve. A bejegyzés írása közben ismét rátaláltam. Ez tudja mindazt amit a Wirble (tulajdonképpen arra épül), és tartalmazza a String#to_proc metódust is. Ezen túl még nagyon sok minden hasznos dolgot nyújt. Próbáljátok ki ezt is. Én biztos megteszem.

Ez itt Bácsi László blogja Rubyról, Ruby on Railsről, JavaScriptről, saját projektekről.

Ajánlj engem