01 września 2013

Definiowanie metod w języku Scala - def

Podczas ostatniego scalania #2 zgodnie określiliśmy potrzebę utrzymywania wiedzy o języku Scala, co powinno pozwolić nam utrzymać tempo (kontynuować rozwiązywanie kolejnych zadań wspólnie) bez obawy, że nowe osoby w temacie (spotkań czy samego języka) nie zostaną na bocznym torze. Większości osób, z którymi dyskutuję odnośnie scalań, leży na sercu angażowanie coraz większej liczby osób do naszych spotkań przy jednoczesnym "karczowaniu" kolejnych połaci wiedzy scalowej. Pojawiają się pomysły daleko sięgające poza znajomość języka, np. poznanie projektów scalatron lub Play Framework i do tego konieczne jest utrzymanie tempa naszej wspólnej nauki.

Zatem do dzieła!

Ten wpis jest kontynuacją pomysłu - w założeniu powinien pomóc w nauce języka programowania Scala, aby wizyta na kolejnym scalania nie wiązała się z koniecznością udziału w poprzednich. Pozostaje jedynie przeczytać materiał szkoleniowy i rozwiązać poprzednie zadania, aby z podniesioną głową móc podjąć się kolejnych.

Podsumowanie scalania 2 znajdziesz na moim blogu w Scalowanie na Scalaniach #2 = scalowych spotkaniach po godzinach. Strona z materiałem ze Scali, który omówiliśmy jest na wiki projektu scalania - Scalania 2.

Dzisiaj słówko kluczowe def, które służy do definiowania metod w Scali.

Specyfikacja The Scala Language Specification Version 2.8 omawia def w rozdziale 4.6 Function Declarations and Definitions. Poniżej wersja skrócona.

Aż do odwołania ten i kolejne wpisy zakładają, że funkcja i metoda są zamienne (co nie jest prawdą, ale wiedza wykracza poza materiał wprowadzający).

Definiowanie funkcji w Scali ma postać def nazwa-funkcji(parametry-funkcji): typ-wyniku = ciało-funkcji. Poniżej kilka definicji funkcji.
def sum(x: Int, y: Int) = x + y

def f(xs: List[Int]) = xs.size

def isPalindrome(ls: List[Int]): Boolean = ls == ls.reverse
Nazwa funkcji nazwa-funkcji jest ciągiem znaków, który (w jednej z trzech możliwych form) rozpoczyna się literą, po której występuje dowolny ciąg znaków - liter i cyfr. Na nasze potrzeby pozostaniemy przy tej definicji.

Parametry funkcji parametry-funkcji występują w nawiasach okrągłych i są listą elementów identyfikator: typ lub identyfikator: typ = wartość-domyślna oddzielonych przecinkiem.

Typ wyniku funkcji typ-wyniku nie jest koniecznym elementem sygnatury i najczęściej jest pomijany. Wyjątkiem jest funkcja rekurencyjna, czyli taka, która wywołuje samą siebie.

Ciałem funkcji ciało-funkcji jest wyrażenie, które opisuje wynik funkcji. Wyrażenie (ang. expression) zawsze zwraca wartość i jest jej opisem.

Tyle wystarczy na początkowe zadania. Gdybym się mylił, proszę o wskazanie braków i/lub zadawanie pytań uzupełniających.

Uczestników scalania 3 uprasza się o wykonanie zadań 1-6. Proszę odpalić Scala REPL i napisać ciała funkcji p1 do p6. Więcej w README projektu scalania.