Witaj
Ten przewodnik składa się z drobnych wprowadzeń do najczęściej używanych funkcjonalności języka Scala.
Jest to jedynie krótkie wprowadzenie, a nie pełny samouczek. Jeżeli szukasz tego drugiego, rozważ jedną z książek lub inne zasoby.
Czym jest Scala?
Scala jest nowoczesnym, wieloparadygmatowym językiem programowania zaprojektowanym do wyrażania powszechnych wzorców programistycznych w zwięzłym, eleganckim i bezpiecznie typowanym stylu. Scala płynnie integruje ze sobą cechy języków funkcyjnych i zorientowanych obiektowo.
Scala jest zorientowana obiektowo
Scala jest czysto obiektowym językiem w tym sensie, że każda wartość jest obiektem. Typy oraz zachowania obiektów są opisane przez klasy oraz cechy. Klasy są rozszerzane przez podtypowanie i elastyczny mechanizm kompozycji domieszek jako zastępstwo dla wielodziedziczenia.
Scala jest funkcyjna
Scala jest też funkcyjnym językiem w tym sensie, że każda funkcja jest wartością. Scala dostarcza lekką składnię do definiowana funkcji anonimowych, wspiera funkcje wyższego rzędu, pozwala funkcjom, by były zagnieżdżone, a także umożliwia rozwijanie funkcji. Klasy przypadków (case class) oraz wbudowane wsparcie dla dopasowania wzorców (pattern matching) wprowadzają do Scali mechanizm typów algebraicznych stosowany w wielu funkcyjnych językach programowania. Obiekty singleton są wygodną metodą grupowania funkcji, które nie należą do żadnej klasy.
Ponadto, mechanizm dopasowania wzorców w naturalny sposób rozszerza się do obsługi przetwarzania danych w formacie XML z pomocą wzorców sekwencji ignorujących prawą stronę, z wykorzystaniem rozszerzeń obiektów ekstraktorów. W tym kontekście wyrażenia for są użyteczne w formułowaniu zapytań. Te i inne funkcjonalności sprawiają, że Scala jest idealnym językiem do tworzenia aplikacji takich jak usługi sieciowe.
Scala jest statycznie typowana
Scala posiada ekspresywny system typów, który zapewnia, że abstrakcje są używane w bezpieczny i należyty sposób. W szczególności system typów wspiera:
- klasy generyczne,
- adnotacje wariancji,
- górne oraz dolne ograniczenia typów,
- klasy zagnieżdżone i typy abstrakcyjne jako elementy obiektów,
- typy złożone,
- jawnie typowane samoreferencje,
- parametry domniemane i konwersje niejawne,
- metody polimorficzne.
Mechanizm lokalnej inferencji typów sprawia, że nie jest konieczne podawanie nadmiarowych informacji o typach w programie. Wszystkie te funkcje języka pozwalają na bezpieczne ponowne użycie programistycznych abstrakcji oraz rozwijanie oprogramowania z bezpieczeństwem dla typów.
Scala jest rozszerzalna
W praktyce rozwiązania specyficzne dla domeny często wymagają odpowiednich, również specyficznych domenowo, rozszerzeń języka. Scala dostarcza unikalne mechanizmy, dzięki którym można łatwo dodawać nowe konstrukcje do języka w postaci bibliotek.
W większości przypadków można to uzyskać bez potrzeby używania technik meta-programowania takich jak np. makra. Oto kilka przykładów:
- Klasy domniemane pozwalają na rozszerzanie już istniejących klas o nowe metody,
- Interpolacja łańcuchów znaków jest rozszerzalna o niestandardowe interpolatory użytkownika.
Scala współdziała z językami JVM
Scala jest zaprojektowana tak, aby jak najlepiej współpracować z popularnym środowiskiem uruchomieniowym Java Runtime Environment (JRE). W szczególności interakcja z językiem Java jest tak płynna, jak tylko jest to możliwe. Nowsze funkcje języka Java takie jak interfejsy funkcyjne (SAM), funkcje anonimowe (lambda), adnotacje oraz typy generyczne posiadają swoje bezpośrednie odwzorowania w języku Scala.
Unikalne dla Scali funkcje, które nie mają odwzorowania w Javie, jak na przykład domyślne wartości parametrów oraz parametry nazwane, są kompilowane tak, aby zachować jak największą zgodność z Javą. Scala posiada taki sam model kompilacji (oddzielna kompilacja, dynamiczne ładowanie klas) jak Java, dzięki czemu umożliwa korzystanie z tysięcy już istniejących, wysokiej klasy bibliotek.
Do dzieła!
Przejdź do kolejnej strony aby dowiedzieć się więcej.
Contributors to this page:
Contents
- Wprowadzenie
- Podstawy
- Hierarchia typów
- Klasy
- Domyślne wartości parametrów
- Parametry nazwane
- Cechy
- Krotki
- Kompozycja klas przez domieszki
- Funkcje wyższego rzędu
- Funkcje zagnieżdżone
- Rozwijanie funkcji (Currying)
- Klasy przypadków
- Dopasowanie wzorców (Pattern matching)
- Obiekty singleton
- Wzorce wyrażeń regularnych
- Obiekty ekstraktorów
- For Comprehensions
- Klasy generyczne
- Wariancje
- Górne ograniczenia typów
- Dolne ograniczenia typów
- Klasy wewnętrzne
- Typy abstrakcyjne
- Typy złożone
- Jawnie typowane samoreferencje
- Parametry domniemane
- Konwersje niejawne
- Metody polimorficzne
- Lokalna inferencja typów
- Operatory
- Parametry przekazywane według nazwy
- Adnotacje
- Pakiety i importy
- Obiekty pakietu