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.

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.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.