tag:blogger.com,1999:blog-20941681.post4257936450822947438..comments2024-02-13T18:09:44.121+01:00Comments on Jacek Laskowski scala jawnie: Metoda a funkcja oraz stan w obiekcie i funkcji w ScaliAnonymoushttp://www.blogger.com/profile/09734540973692423017noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-20941681.post-72617346177500808522013-08-19T10:15:26.574+02:002013-08-19T10:15:26.574+02:00podziękował, z pewnością przeczytam ; )podziękował, z pewnością przeczytam ; )clonazepamumhttps://www.blogger.com/profile/04310076234036233821noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-66684972948111709152013-08-18T22:01:55.955+02:002013-08-18T22:01:55.955+02:00Cześć,
Proponuję zajrzeć do http://jaceklaskowski...Cześć,<br /><br />Proponuję zajrzeć do http://jaceklaskowski.pl/wiki/Apache_Wicket_z_JPA_z_pomoc%C4%85_Spring_Framework_i_Apache_Maven_2 oraz http://jaceklaskowski.pl/wiki/Tworzenie_samodzielnej_aplikacji_ze_Spring_Framework_i_Hibernate_w_NetBeans_IDE_6.9. Trochę stare, ale biorąc pod uwagę, że oddałem się Scali pewnie nie prędko znajdę czas na Spring Framework oraz Hibernate. Na pewno nie w najbliższych kilku m-cach.<br /><br />JacekAnonymoushttps://www.blogger.com/profile/09734540973692423017noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-43496339031372257692013-08-16T19:43:37.840+02:002013-08-16T19:43:37.840+02:00Witam,
czy jeśli będziesz dysponował wolnym czasem...Witam,<br />czy jeśli będziesz dysponował wolnym czasem i chęciami to czy mógłbyś napisać tutorial odnośnie prostej aplikacji webowej w technologiach spring i hibernate?clonazepamumhttps://www.blogger.com/profile/03639994320680809020noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-38244181830053345852013-08-09T15:38:33.138+02:002013-08-09T15:38:33.138+02:00Zwróćcie też uwagę na definicje traitów FunctionX:...Zwróćcie też uwagę na definicje traitów FunctionX:<br /><br />trait Function3[-T1, -T2, -T3, +R] extends AnyRef <br /><br />Konkretnie mam na myśli adnotacje wariancji - wynika z nich, że funkcje zawsze są 'polimorficzne'..<br /><br />Druga różnica jaka przychodzi na myśl - metody nie mają ograniczenia ilości argumentów.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-20941681.post-38134768846227020132013-08-09T12:06:25.695+02:002013-08-09T12:06:25.695+02:00Dodam jeszcze, że w takim razie:
scala> new A(...Dodam jeszcze, że w takim razie:<br /><br />scala> new A().f _<br />res0: Int => Int = <br /><br />Tworzy tak jakby referencję do wywołania metody f w obiekcie stworzonym przez new A(), a nie nową funkcję.<br /><br />Zastanawia mnie jeszcze styl zapisu:<br />new A().f _<br />Moim zdaniem lepszym rozwiązaniem byłoby użycie nawiasów:<br />new A().f(_)<br />Które i tak byłyby wymagane w przypadku większej liczby parametrów:<br />new B().f(_, _)<br /><br />Marcin Pieciukiewiczhttps://www.blogger.com/profile/14703396936344720814noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-71750546755646473442013-08-09T11:40:30.039+02:002013-08-09T11:40:30.039+02:00Po pierwsze, jak zauważył Tomek, metoda różni się ...Po pierwsze, jak zauważył Tomek, metoda różni się od funkcji jedynie tym, że otrzymuje dodatkowy parametr zawierający instancję obiektu (this). Jest to bardzo dobrze widoczne w Pythonie, gdzie każda definicja metody musi mieć pierwszy parametr self (odpowiednik this w Pythonie).<br /><br />Spróbowałem przetestować jak działa konwersja metody na funkcję w Scali i przeprowadziłem prosty test:<br /><br />package pl.marpiec<br /><br />class Functions {<br /> def a(param: String):Int = {<br /> println(this)<br /> param.length<br /> }<br />}<br /><br />object FunctionsTest extends App {<br /> new Functions().a("aa")<br /> val functionA = new Functions().a(_)<br /> functionA("aa")<br />}<br /><br />I niespodziewany wynik działania był taki:<br /><br />pl.marpiec.Functions@633589<br />pl.marpiec.Functions@235b5d<br /><br />Okazuje się, że po stworzeniu referencji functionA, ta funkcja (czy aby na pewno?) cały czas jest powiązana z obiektem z którego pochodzi. Czyli jednak nie stała się funkcją, ale jest cały czas metodą obiektu klasy Functions. A functionA jest jedynie referencją do tej metody.<br /><br />Dlatego chyba należałoby zmodyfikować sposób w jaki rozróżniamy funcję i metodę. Metoda to po prostu taka funkcja, która wykorzystuje instancję obiektu macierzystego.<br /><br /><br />Warto też zauważyć, że Scala w większości przypadków jest tłumaczona w trakcie kompilacji na Jave, dlatego, aby móc stworzyć samodzielną funkcję wykorzystano możliwość umieszczenia jej w klasie Function1, której javowy interfejs może wyglądać tak:<br /><br />interface Function1 {<br /> T function(E param1);<br />}<br /><br />Jest to standardowe podejście w Javie do przekazywania funkcji, np. w przypadku Handlerów w Swingu.<br /><br />Z tego wynika, że pod maską Scali konwersja metody na funkcję polega na stworzeniu klasy FunctionX, którego metoda _wywołuje_ metodę z klasy obiektu oryginalnego. Jest to szczególny sposób implementacji funkcji wynikający z wykorzystania JVM i wydaje się, że z punktu widzenia programisty Scali można to pominąć i faktycznie traktować funkcję jako samodzielny byt. Być może w przyszłości Scala będzie działać na innej wirtualnej maszynie, która nie będzie wymagała takiej gimnastyki ze strony kompilatora.<br />Marcin Pieciukiewiczhttps://www.blogger.com/profile/14703396936344720814noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-48915539199014325752013-08-09T08:56:15.606+02:002013-08-09T08:56:15.606+02:00@Tomasz, jeżeli mam się opowiadać za czymś to za T...@Tomasz, jeżeli mam się opowiadać za czymś to za Twoją wersją :) ToJaJarekhttps://www.blogger.com/profile/07492446399792666065noreply@blogger.comtag:blogger.com,1999:blog-20941681.post-37964510753601465132013-08-08T23:37:51.308+02:002013-08-08T23:37:51.308+02:00Scala na bok, metoda obiektu to funkcja, która prz...Scala na bok, metoda obiektu to funkcja, która przyjmuje automatycznie i przezroczyście referencję "this". Innymi słowy metoda obj.fun(x, y) jest w rzeczywistości funkcją fun(obj, x, y). Metoda to składniowy cukier łączący struktury (struct w C) z funkcjami.<br /><br />Wracając do Scali - metoda w Scali jest równoważna metodzie w Javie. Nie ma tu żadnej różnicy. Natomiast Scala wprowadza funkcje, czyli poniekąd metody "oderwane" od obiektu (czyli po prostu go nie wymagające). Tak jak w języku C.<br /><br />Czasem chcemy użyć metody tam, gdzie wymagana jest funkcja (zauważ, że Scala ma funkcje wyższego rzędu, nie metody). Wtedy kompilator wykonuje za nas proces zwany eta-expansion. Na przykładzie: z obj.foo(x) robi się foo(x), ale parametr this (obj) nie zniknął, referencja nań jest ukryta wewnątrz funkcji. Porównaj to z "naiwnymi" funkcjami i metodami w JavaScript (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind - Examples)<br /><br />To, że w Scali są typy FunctionX i że funkcja jest jednak obiektem nazwałbym szczegółem implementacyjnym. Wszak zamiast "fun: Function1[Int, String]" możesz napisać "fun: (Int => String)" - co nawiasem mówiąc może być czytelniejsze.<br /><br />I ciekawostka z Javy 8. Tam zamiast dajmy na to "forEach(x -> obj.fun(x))" można napisać "forEach(obj::fun)" - czyli wypisz-wymaluj konwersja metody na funkcję.<br /><br />Jeśli interesuje Cię implementacja eta-expansion, zerknij na <a href="http://scala.net.pl/jak-dziala-eta-expansion/" rel="nofollow">Jak działa (i czym jest) eta expansion?</a>Tomasz Nurkiewiczhttps://www.blogger.com/profile/05938011050162061962noreply@blogger.com