08 sierpnia 2013

Metoda a funkcja oraz stan w obiekcie i funkcji w Scali

Trudno byłoby oczekiwać, że poniedziałek, świeżo po wakacjach, mógłby należeć do najmilszych dni, bo w końcu to koniec letniej laby i to nie byle jakiej. Jeszcze posiedziałbym w Niechorzu. Chociaż tydzień dłużej.

Z pewną obawą wracałem do pracy, ale już w biurze czekał na mnie +Grzegorz Balcerek oraz Marcin Jaskólski. Po lekturze kolejnego rozdziału Scala in Action natchnęło mnie na dyskusję o różnicy między metodami a funkcjami w Scali. Ciekawym, ilu z Was zauważa różnicę.

Niech ja zacznę z przedstawieniem swojego zrozumienia.

Metoda jest wyłącznie składową instancji typu (świadomie nie piszę obiektu, aby nie mylić ze scalowym object), podczas gdy funkcja jest bytem niezależnym, żyjącym samodzielnie. Scala oferuje możliwość przekształcenia metody w funkcję za pomocą podkreślnika (dla każdego brakującego parametru).
scala> class A { def f(n: Int) = 5 }
defined class A

scala> new A().f _
res0: Int => Int = <function1>
Od tej pory res0 staje się funkcją jednego parametru typu Int, która zwraca wartość typu Int. Jak widać, funkcja jest więc wartością pewnego typu. Metoda takiej cechy nie posiada.

W Scali sprawa się trochę komplikuje ponieważ każda funkcja jest reprezentowana przez obiekt typu FunctionX, gdzie X oznacza liczbę akceptowanych parametrów wejściowych. Stąd też możnaby powiedzieć, że nawet dla bytów określanych mianem funkcji w Scali istnieje instancja typu scala.FunctionX, co przeczy, że funkcja jest bytem samodzielnym. Czy, aby na pewno?

A co Ty o tym sądzisz? Chętnie wysłucham Twojej wersji, która wyprowadzi mnie z błędu lub uzupełni braki, gdzie potrzeba. Z góry dziękuję.

Nie długo trwało, aby w biurze pojawił się +Paweł Cesar Sanjuan Szklarz! Czyż można byłoby wyobrazić sobie lepsze rozpoczęcie dnia?! Na pewno nie!

Zaintrygowany Paweł poruszył inny temat odnośnie porównania istoty funkcji i obiektu. Dla mnie oba domykają pewien stan i wykonanie obu jest wręcz identyczne. Paweł obiecał pogłówkować nad tym jeszcze, bo nie mógł się zgodzić z tym, że musi się ze mną zgodzić :-) Czekam z niecierpliwością.

Cudnie móc tak rozpocząć pracę po wspaniałym urlopie. Każdemu życzę tak mocnego zespołu merytorycznie, z którym można poruszyć niejeden nietrywialny temat. Bezcenne.

p.s. Są jeszcze wakaty w moim zespole w Citi. Zainteresowanych zapraszam do kontaktu na priv, aby uruchomić proces rekrutacyjny.