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 Object
et 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
println
fü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/data
könyvtáron belül egySeqList.scala
file-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 aprint
függvény közti különbségeket! Írjunk több kiírató kifejezést egymás utáni sorokba aHello
osztá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.