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:

new package

eztán beírhatjuk a nevét:

new package name

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:

new class

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

new object

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
package _01_Hello

object Hello {

}

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:

extends App

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
package _01_Hello

object Hello extends App {
  println( "Hello Scala!" )
}

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:

run hello

(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):

hello scala

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:

play scala

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 egy SeqList.scala file-ba, akkor mivel kell kezdődjön ez a forrásfile-unk?
    válasz mutatása
1
package util.data
  • 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 a print függvény közti különbségeket! Írjunk több kiírató kifejezést egymás utáni sorokba a Hello 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.


Utolsó frissítés: 2021-02-07 23:06:47