Blog (30)
Komentarze (5.6k)
Recenzje (0)

Scala — pierwsze kroki cz.2

@mikolaj_sScala — pierwsze kroki cz.210.08.2014 19:19

Poniższy wpis jest kontynuacją części pierwszej kursu.

Krok trzeci - definiowanie funkcji

Do definiowania funkcji lub metody służy słowo kluczowe def. Napiszemy funkcję max zwracającą większą wartość z dwóch wartości przekazanych jako parametry:

def max(x:Int, y:Int):Int = {
      if(x > y) x
      else y
}

max jest nazwą funkcji przyjmującej dwa parametry typu całkowitego - Int i zwracającą również typ Int. Jak widać pominięto znane z innych języków słowo kluczowe return. Jest ono opcjonalne w tym przypadku i moglibyśmy je dopisać przed x i y. Zwracana jest zawsze ostatnia wartość z miejsca do którego doszła funkcja.

Nie potrzeba też średników po każdej instrukcji. Kompilator sam znajduje gdzie się ona kończy. Charakterystyczne też jest odwrócenie kolejności nazwy argumentu z jego typem, jak również pojawienie się zwracanego typu po liście parametrów funkcji. (Może niektórzy już zorientowali się, że przypomina to sposób zapisu z języka UML.). Nawiasy klamrowe tak jak w większości języków pochodzących od C definiują nam zasięg. W tym przypadku ciało funkcji. Znak równości w pierwszej linii mówi, że funkcja zwraca wartość. Jest ona obowiązkowa dla funkcji. Jeśli jej nie napiszemy to oznacza to procedurę i brak zwracania wartości (oznacza to zwracanie Unit - coś podobnego do void w C).

Funkcję możemy wywołać np. w taki sposób:

max(3, 5)

Na co interpreter odpowie w znany nam już sposób:

res0: Int = 5

Dla małych funkcji i metod możemy skrócić zapis do jednej linijki. Nasza funkcja max może być zapisana w następujący sposób:

def max(x:Int, y:Int) = if(x > y) x else y

Podobnie jak przy definicji z inicjalizacją zmiennych funkcja potrafi sama odgadnąć zwracany typ. Gdy napiszemy procedurę kompilator przypisze jej zwracany typ jako Unit:

def powitanie() = println("Witaj świecie!")
powitanie: ()Unit

Krok czwarty - piszemy skrypty

Mimo, że Scala powstała do pisania dużych programów i systemów to umożliwiono pisanie w niej skryptów. Stwórzmy plik o nazwie hello.scala i napiszmy w nim następującą treść:

println("Witaj świecie z wnętrza skryptu!")

Skrypt uruchamiamy poleceniem:

scala hello.scala

Uruchomienie skryptu trwa kilka sekund ze względu na czas kompilacji. Skrypty w Scali wydają się być miłym dodatkiem i mogą okazać się czasami użyteczne. Jednak nie zastąpią wielu przypadkach ani skryptów Pythona, ani też nie zastąpią większych programów pisanych w Scali. Pobieranie parametrów z konsoli po uruchomieniu skryptu odbywa się za pomocą listy argumentów args z numerem argumentu wpisanym w okrągłe nawiasy. Aby to sprawdzić podmieniamy zawartość skryptu na:

println("Witaj " + args(0) + "!")

Przy okazji widzimy, że napisy skleja się podobnie do C i Java. Teraz uruchamiamy poleceniem:

scala hello.scala Janie

Jeśli zapomnimy wpisać argumentu to pojawi się błąd i rzucony zostanie wyjątek, ponieważ próbujemy dostać się do pustej listy argumentów. Zamieńmy kod na poniższy:

if(!args.isEmpty) println("Witaj " + args(0) + "!")
else println("Witaj Anonimie!")

Dzięki sprawdzeniu czy lista nie jest pusta unikamy problemów.

W systemach Uniksowych możemy uruchamiać skrypty podając tylko ich nazwę, ale dopisując w pierwszej linii za pomocą czego ma on być uruchomiony. W Ubuntu po instalacji Scali z pakietów będzie to:

#!/usr/bin/scala
!#

Po nadaniu praw do uruchomienia plikowi możemy uruchomić skrypt poleceniem:

./hello.scala

Krok piąty - pętla while i zwrotnica if

Wygląd pętli while jest dość standardowy. Napiszmy funkcję liczącą silnie z wykorzystaniem pętli while:

def silnia(n:Int) = {
    var i = 1
    var s = 1
    while( i < n) {
        i += 1
        s *= i 
    } 
    s 
}

silnia(5)

Nie jest to kod pokazujący typowy styl programowania w Scali ponieważ, nie unikamy tutaj iterowania po indeksie i co jest zbędne. W kodzie znajdziemy też znane z języka C i Javy skróty operacji: i += 1 to i = i + 1 oraz s *= i to s = s * i.

Umieśćmy teraz w pliku drukujargumenty.scala następujący kod:


var i = 0
while (i < args.length) {
    if(i != 0) print(" ")
    print(args(i))
    i += 1
}
println()

i uruchamiamy poleceniem:

scala drukujargumenty.scala Scala jest fajna

Instrukcja if sprawdza warunek logiczny i podobnie jak w Javie nie przepuści innej operacji nie zwracającej prawdy lub fałszu. Instrukcje w bloku if muszą być ograniczone nawiasami klamrowymi gdy jest ich więcej. Funkcja print drukuje napis na konsolę bez dodawania znaku nowej linii, a metoda length listy args sprawdza ilość elementów w liście (w tym przypadku ilość argumentów w konsoli). Jeśli chcemy napisać kilka poleceń w jednej linii to możemy oddzielić je średnikami.

Krok szósty - pętla for i foreach

Realizacja funkcji silni za pomocą pętli for:

def silnia(n:Int) = {
    var s = 1
    for(i <- 1 to n) { s *= i }
    s
}

silnia(5)

Jak widać nie jest to typowa dla języków C i Javy funkcja for. Bardziej podobna jest do pętli z Pythona. Generuje liczby od 1 do n ( 1 to n) i podstawia pod zmienną i. Drukowanie argumentów z konsoli w pliku drukujargumenty.scala można skrócić do:

for(arg <- args) print(arg + " ")
println()

Foreach jest metodą którą posiadają kolekcje (sekwencje, listy, tablice itp.). Umożliwia ona pisanie kodu w zwarty sposób. Naszą funkcję silnia możemy napisać dzięki temu krócej:

def silnia(n:Int) = {
    var s = 1
    (1 to n).foreach(i => s *= i)
    s
}
silnia(5)

We wnętrzu metody foreach użyta została funkcja anonimowa. Jest to skrócona forma, która mogłaby wyglądać tak:

(i:Int) => {s *= i}

Do pełnej funkcji brakuje słowa kluczowego def, nazwy funkcji i zamiast znaku równości mamy =>.

W pliku drukujargumenty.scala możemy podmienić kod na:

args.foreach(arg => print(arg + " "))
println()

Minusem jest fakt, że na końcu zostanie spacja. Można to rozwiązać jeszcze prościej używając metody mkString:

print(args.mkString(" "))

Użycie metody foreach pokazuje styl programowania funkcyjnego.

Do zobaczenia w następnym odcinku ;)

Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.