Scala Language Samouczek
Rozpoczęcie pracy z językiem Scala
Szukaj…
Uwagi
Scala jest nowoczesnym językiem programowania opartym na wielu paradygmatach, zaprojektowanym do wyrażania typowych wzorców programowania w zwięzły, elegancki i bezpieczny sposób. Płynnie integruje funkcje języków obiektowych i funkcjonalnych .
Większość podanych przykładów wymaga działającej instalacji Scali. To jest strona instalacji Scali , a jest to przykład „Jak skonfigurować Scalę” . scalafiddle.net jest dobrym źródłem do wykonywania małych przykładów kodu w Internecie.
Wersje
Wersja | Data wydania |
---|---|
2.10.1 | 2013-03-13 |
2.10.2 | 2013-06-06 |
2.10.3 | 01.10.2013 |
2.10.4 | 24.03.2014 |
2.10.5 | 2015-03-05 |
2.10.6 | 2015-09-18 |
2.11.0 | 21.04.2014 |
2.11.1 | 21.05.2014 |
2.11.2 | 2014-07-24 |
2.11.4 | 30.10.2014 |
2.11.5 | 14.01.2014 |
2.11.6 | 2015-03-05 |
2.11.7 | 2015-06-23 |
2.11.8 | 08.03.2016 |
2.11.11 | 19.04.2017 |
2.12.0 | 2016-11-03 |
2.12.1 | 06.12.2016 |
2.12.2 | 19.04.2017 |
Hello World, definiując „główną” metodę
Umieść ten kod w pliku o nazwie HelloWorld.scala
:
object Hello {
def main(args: Array[String]): Unit = {
println("Hello World!")
}
}
Aby skompilować go do kodu bajtowego, który jest wykonywalny przez JVM:
$ scalac HelloWorld.scala
Aby uruchomić:
$ scala Hello
Gdy środowisko wykonawcze Scala ładuje program, szuka obiektu o nazwie Hello
za pomocą main
metody. main
metodą jest punkt wejścia programu i jest ona wykonywana.
Zauważ, że w przeciwieństwie do Javy, Scala nie wymaga nazywania obiektów ani klas po pliku, w którym się znajdują. Zamiast tego parametr Hello
przekazany w poleceniu scala Hello
odnosi się do scala Hello
obiektu, który zawiera main
metodę do wykonania. Zupełnie możliwe jest posiadanie wielu obiektów za pomocą głównych metod w tym samym pliku .scala
.
Tablica args
będzie zawierać argumenty wiersza poleceń podane programowi, jeśli takie istnieją. Na przykład możemy zmodyfikować program w następujący sposób:
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello World!")
for {
arg <- args
} println(s"Arg=$arg")
}
}
Skompiluj to:
$ scalac HelloWorld.scala
A następnie wykonaj to:
$ scala HelloWorld 1 2 3
Hello World!
Arg=1
Arg=2
Arg=3
Hello World, rozszerzając aplikację
object HelloWorld extends App {
println("Hello, world!")
}
Rozszerzając cechę App
, można uniknąć zdefiniowania wyraźnej metody main
. Całe ciało obiektu HelloWorld
jest traktowane jako „metoda główna”.
Opóźniona inicjalizacja
Zgodnie z oficjalną dokumentacją
App
korzysta z funkcji zwanej opóźnioną inicjalizacją . Oznacza to, że pola obiektowe są inicjowane po wywołaniu metody głównej.
Opóźniona inicjalizacja
Zgodnie z oficjalną dokumentacją
App
korzysta z funkcji zwanej opóźnioną inicjalizacją . Oznacza to, że pola obiektowe są inicjowane po wywołaniu metody głównej.
DelayedInit
jest teraz przestarzałe do użytku ogólnego, ale nadal jest obsługiwane dlaApp
jako szczególny przypadek. Wsparcie będzie kontynuowane do momentu decyzji i wdrożenia funkcji zastępczej.
Aby uzyskać dostęp do argumentów wiersza polecenia podczas rozszerzania App
, użyj this.args
:
object HelloWorld extends App {
println("Hello World!")
for {
arg <- this.args
} println(s"Arg=$arg")
}
Podczas korzystania z App
ciało obiektu zostanie wykonane jako metoda main
, nie ma potrzeby zastępowania main
.
Hello World jako skrypt
Scala może być używana jako język skryptowy. Aby to zademonstrować, utwórz HelloWorld.scala
o następującej treści:
println("Hello")
Wykonaj go za pomocą interpretera wiersza poleceń ( $
to wiersz polecenia):
$ scala HelloWorld.scala
Hello
Jeśli pominiesz .scala
(na przykład jeśli po prostu wpisałeś scala HelloWorld
), biegacz będzie szukał skompilowanego pliku .class
z kodem bajtowym zamiast kompilować, a następnie uruchamiać skrypt.
Uwaga: Jeśli scala jest używany jako język skryptowy, nie można zdefiniować pakietu.
W systemach operacyjnych wykorzystujących bash
lub podobne terminale powłoki, skrypty Scala mogą być wykonywane przy użyciu „preambuły powłoki”. Utwórz plik o nazwie HelloWorld.sh
i umieść następujące elementy jako jego zawartość:
#!/bin/sh
exec scala "$0" "$@"
!#
println("Hello")
Części między #!
a !#
to „preambuła powłoki”, która jest interpretowana jako skrypt bash. Reszta to Scala.
Po zapisaniu powyższego pliku musisz udzielić mu uprawnień „wykonywalnych”. W powłoce możesz to zrobić:
$ chmod a+x HelloWorld.sh
(Pamiętaj, że daje to wszystkim uprawnienia: przeczytaj o chmod, aby dowiedzieć się, jak ustawić go dla bardziej określonych zestawów użytkowników).
Teraz możesz wykonać skrypt w następujący sposób:
$ ./HelloWorld.sh
Korzystanie ze Scala REPL
Kiedy wykonujesz scala
w terminalu bez dodatkowych parametrów, otwiera się interpreter REPL (Read-Eval-Print Loop):
nford:~ $ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_66).
Type in expressions for evaluation. Or try :help.
scala>
REPL pozwala na wykonywanie Scali w stylu arkusza roboczego: kontekst wykonania zostaje zachowany i można ręcznie wypróbować polecenia bez konieczności budowania całego programu. Na przykład, wpisując val poem = "As halcyons we shall be"
wyglądałoby to tak:
scala> val poem = "As halcyons we shall be"
poem: String = As halcyons we shall be
Teraz możemy wydrukować naszą val
:
scala> print(poem)
As halcyons we shall be
Zauważ, że val
jest niezmienny i nie można go zastąpić:
scala> poem = "Brooding on the open sea"
<console>:12: error: reassignment to val
poem = "Brooding on the open sea"
Ale w REPL można przedefiniować do val
(co mogłoby spowodować błąd w normalnym programie Scala, jeśli to było robione w tym samym zakresie):
scala> val poem = "Brooding on the open sea"
poem: String = Brooding on the open sea
Przez resztę sesji REPL ta nowo zdefiniowana zmienna będzie przesłaniać poprzednio zdefiniowaną zmienną. REPL są przydatne do szybkiego zobaczenia, jak działają obiekty lub inny kod. Wszystkie funkcje Scali są dostępne: możesz zdefiniować funkcje, klasy, metody itp.
Scala Quicksheet
Opis | Kod |
---|---|
Przypisz niezmienną wartość int | val x = 3 |
Przypisz zmienną wartość int | var x = 3 |
Przypisz niezmienną wartość jawnym typem | val x: Int = 27 |
Przypisz leniwie oszacowaną wartość | lazy val y = print("Sleeping in.") |
Powiąż funkcję z nazwą | val f = (x: Int) => x * x |
Powiąż funkcję z nazwą o wyraźnym typie | val f: Int => Int = (x: Int) => x * x |
Zdefiniuj metodę | def f(x: Int) = x * x |
Zdefiniuj metodę z wyraźnym pisaniem | def f(x: Int): Int = x * x |
Zdefiniuj klasę | class Hopper(someParam: Int) { ... } |
Zdefiniuj obiekt | object Hopper(someParam: Int) { ... } |
Zdefiniuj cechę | trait Grace { ... } |
Uzyskaj pierwszy element sekwencji | Seq(1,2,3).head |
Jeśli zmień | val result = if(x > 0) "Positive!" |
Zdobądź wszystkie elementy sekwencji oprócz pierwszego | Seq(1,2,3).tail |
Pętlę przez listę | for { x <- Seq(1,2,3) } print(x) |
Zagnieżdżone zapętlenie | for { |
Dla każdego elementu listy wykonaj funkcję | List(1,2,3).foreach { println } |
Drukuj na standardowe wyjście | print("Ada Lovelace") |
Sortuj listę alfanumerycznie | List('b','c','a').sorted |