02 - Hello Scala¶
Ha az előző részben leírtaknak megfelelően ideában létrehoztunk egy Scala projektet,
akkor a forráskódjainkat a src/main/scala könyvtáron belül fogjuk elhelyezni.
A Scala is a Javához hasonlóan könyvtárstruktúrában rendszerezi a rengeteg forrásfilet:
az src/main/scala könyvtáron belüli alkönyvtárak csomagokat, avagy package-eket fognak alkotni.
Akit részletesebben érdekel a package struktúra, olvashat róla itt többet.
Jó gyakorlat külön csomagba rakni a logikailag elkülönülő egységeket, ezért most létrehozunk egyet,
mondjuk _01_Hello néven (a számjeggyel kezdés problémás, ezért rakok elé underscoret, mert sorrendben szeretném majd látni a csomagokat).
Jobb klikk a src/main/scala könyvtárra a projektstruktúrában, new és package kiválasztása:

eztán beírhatjuk a nevét:

A projektstruktúrában létrejövő _01_Hello alkönyvtáron most jobb klikk, ide hozzuk létre az első futtatható kódunkat:
new és Scala class:

Figyeljünk arra, hogy a feljövő ablakban az Objectet válasszuk ki, és adjuk neki pl. a Hello nevet:

Hogy mi a különbség Object, Class, Trait és Case Class közt, később meglátjuk.
Egyelőre az IDEA ha mindent jól csináltunk, létrehoz egy forrásfilet Hello.scala néven a következő tartalommal:
1 2 3 4 5 | |
A file első sorában a csomag azonosítója szerepel: ugyanúgy, mint Javában, itt is figyelnünk kell arra, hogy ez megfeleljen a forrásfile-t
ténylegesen tartalmazó könyvtárszerkezetnek. Lehet csomagokat egymásba is ágyazni hierarchikusan, ez forrásfile szinten pontokkal
lesz szeparálva: pl. ha a src/main/scala könyvtáron belül létrehozunk egy hu alkönyvtárat, azon belül egy szte, és azon belül egy inf
könyvtárat, és ezen belül hozunk létre egy Scala forrásfile-t, akkor ennek a fejlécében az import hu.szte.inf sor kell álljon.
Egy scala forrásfileon belül több ,,objektumot'' vagy ,,osztályt'' (később látni fogjuk, mik ezek) is létrehozhatunk, ezek közül csak
némelyik lesz érvényes belépési pontja egy programnak. C-ben a belépési pont egy int main( int argc, char* argv[] ) fejlécű függvény
volt, ha volt ilyen a linkelt kódban, akkor lehetett futtatni; Scalában több mód van rá, hogy megmondjuk, mi legyen a belépési pontunk,
egy módszer az, ha egy olyan objectet hozunk létre, melyről explicit megmondjuk, hogy ez egy App oly módon, hogy a neve mögé írjuk
az extends App részt:

Miközben gépeljük az App szót, az IDEA fel fogja ajánlani automatikus kiegészítésre: fogadjuk is ezt el, ha akarjuk, de ki is írhatjuk.
Ezzel elérjük azt, hogy ami a most meglévő { ... } rész közé kerül, az egy futtatható kód lesz, hasonlóan ahhoz, mintha C-ben a main
függvény belsejét írnánk ide. Természetesen az első programunk csak ki fogja írni konzolra, hogy ,,Hello Scala!'', mégpedig a println
függvénnyel:
1 2 3 4 5 | |
Ebből a következőket tudtuk meg:
- A
printlnfüggvény az argumentumként kapott stringet kiírja a konzolra - Stringeket Scalában
""idézőjelben adhatunk meg - Nem kell pontosvesszőt tenni a sorok végére (de lehet, csak nem Scala idiomatikus, nem ,,szép'')
Most már így van egy olyan része a programunknak, melyet akár futtathatnánk is. Hogy mit szeretnénk futtatni (és esetlegesen milyen argumentumokkal), azt ideában megadhatjuk Run Configuration létrehozásával: ha a csomagjainkban ezen a projekten belül több Appot hozunk létre, akkor mindegyikhez készíthetünk egy-egy run configot és mindig azt indíthatjuk el, amelyiket épp futtatni szeretnénk.
Készítsünk egy run configot: ezt meg lehet tenni a jobb fent lévő ,,Add Configuration...'' menü használatával is, de gyorsabb a jobb klikk a projektstruktúrában a Hello objektumon, majd a ,,Run Hello'' menüpont kiválasztása:

(note: ha nincs ilyen menüpontunk, akkor lehet, hogy elfelejtettük extendelni az Appot, vagy nem objectként deklaráltuk a Hellot, hanem pl. classként. Ezeket javítsuk, ha ilyenbe futunk.)
Ha minden jól ment, bal alul azt látjuk, hogy sikeresen lefut a program és kiírja a konzolra, hogy Hello Scala!
(ha véletlen nem a konzol ablakot látjuk ott, akkor az alsó fülek közül válasszuk ki a Run-t), egy enterrel a végén
(a println függvény tesz egy sorvég karaktert a kapott string mögé, a print függvény pedig nem):

Innentől ha módosítunk a Hello objektum törzsében bármit, akkor újrafuttatáshoz most már a jobb fent megjelenő zöld ,,play'' gomb
megnyomása (vagy shift+F10) is elegendő lesz:

Ha több run konfigunk is van a projektben, akkor közülük a play gombtól balra lévő lenyíló menüben tudunk válogatni.
Kérdések, feladatok¶
- Ha kódot helyezünk el a projekten belül a
src/main/scala/util/datakönyvtáron belül egySeqList.scalafile-ba, akkor mivel kell kezdődjön ez a forrásfile-unk?
válasz mutatása
1 | |
- Hova kell elhelyezhetnünk a mostani alkalom alapján a kódot, hogy ott lehessen az alkalmazás belépési pontja?
válasz mutatása
Egy olyan `object` törzsébe, mely extendeli az App traitet, pl. `object MyApp extends App { ... }` itt a ... helyére.- Lehet-e több belépési pontunk is egy IDEA projekten belül?
válasz mutatása
Igen, lehet, mindegyikhez létrehozhatunk külön-külön run konfigurációkat, majd például a konfig választó combo boxban kiválaszthatjuk, melyiket szeretnénk éppen futtatni.- Próbáljuk ki a
println()és aprintfüggvény közti különbségeket! Írjunk több kiírató kifejezést egymás utáni sorokba aHelloosztályunk törzsébe, próbáljuk ki mindkét függvényt, hogy az őt követő további print kifejezések mikor kerülnek új sorba, mikor nem. Próbáljunk meg kiíratni számokat is: egészeket is, lebegőpontosakat is ki lehet, hasonlóan a stringekhez.