Kategória: Scala.
A változók minden nyelv alapelemei, kezdjük ezekkel!
Típusok
A szokásos alaptípusok itt is megtalálhatóak, viszont fontos tudnunk, hogy nincsenek primitív típusok, mindegyik típus objektum. Így a névkonvenció alapján nagy kezdőbetűvel kell írnunk. A szám típusok mindegyik előjeles. Típusok:
- Byte: 1 bájtos egész
- Short: 2 bájtos egész
- Int: 4 bájtos egész
- Long: 8 bájtos egész
- Float: 4 bájots lebegőpontos
- Double: 8 bájtos lebegőpontos
- Char: 2 bájtos előjel nélküli Unicode karakter
- Boolean: logikai
Mivel minden objektum, azon metódusok hívhatóak, pl. 5.toShort.
Változók deklarálása
Kétféleképpen deklarálhatunk változót:
- var kulcsszóval: ezzel valóban változót deklarálunk, amit meg lehet változtatni, pl. var a = 2.
- val kulcsszóval: ezzel igazából nem változót, hanem konstanst deklarálunk, tehát mintha a Java-ban a final kulcsszót használnánk, pl. val b = 3. Ezt megváltoztatni nem lehet. A funkcionális programozásban javasolt a val használata ott, ahol csak lehet, ugyanis ez esetben a fordító tud optimalizálni, míg a var esetén kevésbé.
A példákban láthattuk, hogy nem kellett megadni a típust, azt a fordító kitalálja. A fenti példákban Int típusúként deklarálta. Ha ettől el szeretnénk térni, akkor a változónév után kettősponttal elválasztva tudjuk megadni a típust (tehát nem elébe tesszük, mint a Java-ban), pl. val b: Byte = 3.
Értékadásnál a szokásos prefixeket és postfixeket használhatjuk, pl. 0XA1 (hexadecimális), 035 (oktális), 12345678L (Long), 3.14f (Float), ill. logikai típusnál true és false.
Operátorok
A megszokott operátorok megtalálhatóak a Scala-ban is, ugyancsak megszokott precedenciával:
- Aritmetikai: +, -, *, /, %
- Relációs: ==, !=, <, >, <=, >= (az összehasonlítás mindig érték szerint történik, így itt nincs jelen a Java-ban megtalálható anomália, hogy két azonos értékű String összehasonlítása hol igaz, hol hamis; itt mindig igaz)
- Logikai: &&, ||, !
- Bitműveletek: &, |, ^, ~, <<, >>, >>> (a mozgatáskor balról mindig nullával tölti föl, előjeltől függetlenül)
- Értékadó: =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=
Megjegyzés: a Spark környezetben előfordul a === és a =!= operátor is; ezek DataFrame-ben oszlop szerinti szűrést hajtanak végre.
String
A String Char-ok sorozata. A Java-ban megszokott módon tudunk értéket adni, pl. val s = "hello". A típust itt sem kötelező megadni, de megadhatjuk, ha szeretnénk, pl. val s: String = "hello". A Java-ban megszokott módon tudunk String-eket egymás után fűzni, pl. "hello" + " world". Használhatjuk a szokásos formázó escape karaktereket, pl. \t a tabulátort, \n az új sort jelenti. Pl. println("apple\tpeach\nbanana"). Néhány, ugyancsak megszokott függvény, amelyet String-en tudunk végrehajtani:
- Int length()
- Char charAt(i)
- String trim()
- String toUpperCase()
- String toLowerCase()
- Boolean startsWith(s)
- String replaceAll(s1, s2)
- String[] split(regex)
Azonban a Java-hoz képest történt pár előrelépés is. Pl. megjelent a több soros String, melyet 3 idézőjellel lehet megadni, pl.
val ls = """This is
a multi line
String"""
Bevezették az interpolátorokat:
- s (string) interpolátor: automatikusan behelyettesíti egy változó értékét, pl. val name = "Csaba"; println(s"Szia, $name") azt írja ki, hogy "Szia, Csaba" (ez egyúttal példa arra is, hogy a pontosvessző itt is használható). Ill. kiszámolja a műveletek értékét, pl. println(s"2 + 3 = ${2+3}") eredménye ez: 2 + 3 = 5.
- f (format) interpolátor: a jó öreg printf függvény szokásos formázásait tudjuk használni, pl. println(f"${Math.PI}%.2f") a pi értékét írja ki 2 tizedes pontossággal.
- raw (nyers) interpolátor: minden formázást figyelme kívül hagy, pl. a println(raw"apple\tpeach\nbanana") ezt írja ki: apple\tpeach\nbanana.
Egyéb típusok
A Scala típus struktúrája igen gazdag más programozási nyelvekhez képest, ebben a fejezetben épp hogy csak a felszínt karcoltuk. A további részletek megismeréséhez a Scala objektumorientált részeit is ismernünk kell, így a későbbiekben újabb típusok bemutatására kerül majd sor.
Egy példa
A következő (és valójában a többi) példát vagy beletesszük egy main függvénybe, vagy parancssorból is futtathatjuk egyesével.
val i = 2
var s: Short = 3
println(s"Sum = ${i+s}")
s = 4
println(s > 3)
println("Hello, World!".toLowerCase)
Parancssorból futtatva a println sem kell, anélkül is kiírja az eredményt. Az egyszerűség érdekében a println-t sok esetben elhagyjuk.