Wednesday, October 28, 2009

Scala - znak równości a wartość zwracana przez funkcję

Przeczytałem dziś o ciekawej własności, może raczej pewnym niuansie, związanym z typem zwracanym przez funkcje w Scali. Deklarując funkcję podajemy zwykle na końcu zwracany przez nią typ.
def pokaz(a: Int): Unit = {
println(a)
}


To co mnie zdziwiło to typ Unit. Używamy go gdy zadaniem funkcji, którą tworzymy nie jest zwrócenie nowej wartości, ale jej efekt uboczny. Efekt uboczny rozumiany jako "funkcja powinna zwrócić wartość, ale jeżeli tego nie robi to znaczy, że wszystko co robi jest jej efekt ubocznym". W tym przypadku efektem ubocznym funkcji (która z natury powinna coś zwrócić) jest wyświetlenie parametru na ekranie.

Tak więc gdy gdy typem zwracanym przez funkcję jest Unit wiemy, że celem funkcji nie jest zwrócenie nam jakiejś wartości, ale wykonanie innych zadań. To co mnie zaciekawiło to fakt iż pominięcie znaku równości przy deklarowaniu funkcji oznacza domyślnie "zwracam Unit. Powstaję tylko dla moich efektów ubocznych" zaś jego podanie oznacza "zwracam jakąś wartość".Co łatwo zobaczyć :)

scala> def funkcja() = { "String" }
funkcja: ()java.lang.String

scala> def funkcja() { "String" }
funkcja: ()Unit


Podoba mi się takie rozróżnienie :)

No comments: