11.1. Funkcje są obiektami
Scala jest językiem obiektowym i funkcje w Scali są obiektami. Precyzując, funkcja w Scali jest instancją klasy dziedziczącej z jednej z klas FunctionN, gdzie N jest nieujemną liczbą całkowitą. Funkcje są wartościami, a więc mogą być na przykład przypisywane do zmiennych lub przekazywane jako argumenty metod lub innych funkcji.
Przykładem funkcji jest obiekt zdefiniowany w pliku Functions1.scala.
Plik Functions1.scala: object hello extends Function0[String] { def apply: String = "Hello!" }
Obiekt hello dziedziczy z Function0[String], co oznacza, że jest funkcją, która nie ma parametrów i która zwraca wartość typu String. W celu wywołania funkcji należy wywołać jej metodę apply.
scala> hello.apply() res0: String = Hello!
Metodę apply można również wywołać stosując skrótową notację, polegającą na pominięciu w wywołaniu znaku kropki i nazwy metody. Wobec tego alternatywny sposób wywołania funkcji hello jest następujący.
scala> hello() res1: String = Hello!
Przy wywoływaniu tej funkcji w sposób skrótowy nie należy pomijać nawiasów, aby zamiast wywołania funkcji nie otrzymać referencji do obiektu.
scala> hello res2: hello.type = <function0>
Plik Functions2.scala zawiera definicję funkcji dwuparametrowej, która przyjmuje dwa argumenty typu Int i zwraca wartość logiczną, która określa, czy wartość pierwszego parametru jest większa od wartości drugiego parametru.
Plik Functions2.scala: object isGreater extends Function2[Int,Int,Boolean] { def apply(a: Int, b:Int): Boolean = a > b }
Przykładowe wywołanie funkcji isGreater wygląda następująco.
scala> isGreater(2,1) res3: Boolean = true
Zapis Function2[Int,Int,Boolean] oznacza typ reprezentujący funkcje dwuargumentowe, które pobierają dwa argumenty typu Int i zwracają wynik w postaci wartości logicznej. Zamiast tego zapisu można użyć innego, jednego z podanych poniżej.
- (Int,Int) => Boolean
- (Int,Int) ⇒ Boolean
W nawiasach są umieszczone typy parametrów przyjmowanych przez funkcję, a po strzałce jest określony typ wyniku funkcji. W pliku Functions3.scala znajdują się definicje funkcji isSmaller1 i isSmaller2, wykorzystujące poznaną notację.
Plik Functions3.scala: object isSmaller extends ((Int,Int) => Boolean) { def apply(a: Int, b:Int): Boolean = a < b } object isSmaller2 extends ((Int,Int) ⇒ Boolean) { def apply(a: Int, b:Int): Boolean = a < b }
Poniżej znajdują się przykładowe wywołania tych funkcji.
scala> isSmaller(4,3) res4: Boolean = false scala> isSmaller2(2,3) res5: Boolean = true
![]() | Specyfikacja języka Scala opisuje typy funkcyjne w punkcie 3.2.9, a klasy FunctionN w punkcie 12.3.3. |
Plik Functions1.scala:
object hello extends Function0[String] {
def apply: String = "Hello!"
}

