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.



