layout | title | language | partof | num | next-page | previous-page |
---|---|---|---|---|---|---|
tour | Osnove | ba | scala-tour | 2 | unified-types | tour-of-scala |
Na ovoj stranici ćemo objasniti osnove Scale.
Scalu možete probati u Vašem browser sa Scastie aplikacijom.
- Idite na Scastie.
- Zalijepite
println("Hello, world!")
u lijevi panel. - Kliknite "Run" dugme. Izlaz će se pojaviti u desnom panelu.
Ovo je jednostavan način za eksperimentisanje sa Scala kodom.
Izrazi su izjave koje imaju vrijednost.
1 + 1
Rezultate izraza možete prikazati pomoću println
.
println(1) // 1 println(1+1) // 2 println("Hello!") // Hello! println("Hello,"+" world!") // Hello, world!
Rezultatima možete dodijeliti naziv pomoću ključne riječi val
.
valx=1+1 println(x) // 2
Imenovani rezultati, kao x
ovdje, nazivaju se vrijednostima. Referenciranje vrijednosti ne okida njeno ponovno izračunavanje.
Vrijednosti se ne mogu mijenjati.
x =3// Ovo se ne kompajlira.
Tipovi vrijednosti mogu biti (automatski) zaključeni, ali možete i eksplicitno navesti tip:
valx:Int=1+1
Primijetite da deklaracija tipa Int
dolazi nakon identifikatora x
. Također morate dodati i :
.
Varijable su kao vrijednosti, osim što ih možete promijeniti. Varijable se definišu ključnom riječju var
.
varx=1+1 x =3// Ovo se kompajlira jer je "x" deklarisano s "var" ključnom riječju. println(x * x) // 9
Kao i s vrijednostima, tip možete eksplicitno navesti ako želite:
varx:Int=1+1
Izraze možete kombinovati okružujući ih s {}
. Ovo se naziva blok.
Rezultat zadnjeg izraza u bloku je rezultat cijelog bloka, također.
println({ valx=1+1 x +1 }) // 3
Funkcije su izrazi koji primaju parametre.
Možete definisati anonimnu funkciju (bez imena) koja vraća cijeli broj plus jedan:
(x: Int) => x +1
Na lijevoj strani =>
je lista parametara. Na desnoj strani je izraz koji koristi date parametre.
Funkcije možete i imenovati.
valaddOne= (x: Int) => x +1 println(addOne(1)) // 2
Funkcije mogu imati više parametara.
valadd= (x: Int, y: Int) => x + y println(add(1, 2)) // 3
Ili bez parametara.
valgetTheAnswer= () =>42 println(getTheAnswer()) // 42
Metode izgledaju i ponašaju se vrlo slično funkcijama, ali postoji nekoliko razlika između njih.
Metode se definišu ključnom riječju def
. Nakon def
slijedi naziv, lista parametara, povratni tip, i tijelo.
defadd(x: Int, y: Int):Int= x + y println(add(1, 2)) // 3
Primijetite da je povratni tip deklarisan nakon liste parametara i dvotačke : Int
.
Metode mogu imati više listi parametara.
defaddThenMultiply(x: Int, y: Int)(multiplier: Int):Int= (x + y) * multiplier println(addThenMultiply(1, 2)(3)) // 9
Ili bez listi parametara ikako.
defname:String=System.getProperty("name") println("Hello, "+ name +"!")
Postoje i neke druge razlike, ali zasad, možete misliti o njima kao nečemu sličnom funkcijama.
Metode mogu imati višelinijske izraze također.
defgetSquareString(input: Double):String= { valsquare= input * input square.toString } println(getSquareString(2.5)) // 6.25
Zadnjo izraz u tijelu metode je povratna vrijednost metode. (Scala ima ključnu riječ return
, ali se rijetko koristi.)
Klasu možete definisati ključnom riječju class
praćenom imenom i parametrima konstruktora.
classGreeter(prefix: String, suffix: String) { defgreet(name: String):Unit= println(prefix + name + suffix) }
Povratni tip metode greet
je Unit
, koji kaže da metoda ne vraća ništa značajno. Koristi se slično kao void
u Javi ili C-u. (Razlika je u tome što svaki Scalin izraz mora imati neku vrijednost, postoji singlton vrijednost tipa Unit
, piše se ()
. Ne prenosi nikakvu korisnu informaciju.)
Instancu klase možete kreirati pomoću ključne riječi new
.
valgreeter=newGreeter("Hello, ", "!") greeter.greet("Scala developer") // Hello, Scala developer!
Detaljniji pregled klasa biće dat kasnije.
Scala ima poseban tip klase koji se zove "case" klasa. Po defaultu, case klase su nepromjenjive i porede se po vrijednosti. Možete ih definisati s case class
ključnim riječima.
caseclassPoint(x: Int, y: Int)
Instancu case klase možete kreirati i bez ključne riječi new
.
valpoint=Point(1, 2) valanotherPoint=Point(1, 2) valyetAnotherPoint=Point(2, 2)
I porede se po vrijednosti.
if (point == anotherPoint) { println(s"$point and $anotherPoint are the same.") } else { println(s"$point and $anotherPoint are different.") } // Point(1,2) i Point(1,2) su iste.if (point == yetAnotherPoint) { println(s"$point and $yetAnotherPoint are the same.") } else { println(s"$point and $yetAnotherPoint are different.") } // Point(1,2) su Point(2,2) različite.
Ima još mnogo stvari vezanih za case klase koje bismo voljeli objasniti, i ubijeđeni smo da ćete se zaljubiti u njih! 0 Objasnićemo ih u dubinu kasnije.
Objekti su jedine instance svojih definicija. Možete misliti o njima kao singltonima svoje vlastite klase. Objekte možete definisati ključnom riječju object
.
objectIdFactory { privatevarcounter=0defcreate():Int= { counter +=1 counter } }
Objektima možete pristupati referenciranjem njihovog imena.
valnewId:Int=IdFactory.create() println(newId) // 1valnewerId:Int=IdFactory.create() println(newerId) // 2
Objekti će biti objašnjeni u dubinu kasnije.
Trejtovi su tipovi koji sadrže polja i metode. Više trejtova se može kombinovati.
Definišu se pomoću trait
ključne riječi.
traitGreeter { defgreet(name: String):Unit }
Metode trejtova mogu imati defaultnu implementaciju.
traitGreeter { defgreet(name: String):Unit= println("Hello, "+ name +"!") }
Možete naslijediti trejtove s extends
ključnom riječi i redefinisati (override) implementacije s override
ključnom riječi.
classDefaultGreeterextendsGreeterclassCustomizableGreeter(prefix: String, postfix: String) extendsGreeter { overridedefgreet(name: String):Unit= { println(prefix + name + postfix) } } valgreeter=newDefaultGreeter() greeter.greet("Scala developer") // Hello, Scala developer!valcustomGreeter=newCustomizableGreeter("How are you, ", "?") customGreeter.greet("Scala developer") // How are you, Scala developer?
Ovdje, DefaultGreeter
nasljeđuje samo jedan trejt, ali može naslijediti više njih.
Trejtove ćemo pokriti u dubinu kasnije.
Glavna metoda je ulazna tačka programa. Java Virtuelna Mašina traži da se glavna metoda zove main
i da prima jedan argument, niz stringova.
Koristeći objekt, možete definisati glavnu metodu ovako:
objectMain { defmain(args: Array[String]):Unit= println("Hello, Scala developer!") }