Jak działa magia metody apply () Scali?

W Scali, jeśli zdefiniuję metodę o nazwie apply w klasie lub obiekcie najwyższego poziomu, ta metoda będzie wywoływana za każdym razem, gdy dodam parę nawiasów do instancji tej klasy i umieszczę odpowiednie argumenty dla apply() pomiędzy nimi. Na przykład:

class Foo(x: Int) {
    def apply(y: Int) = {
        x*x + y*y
    }
}

val f = new Foo(3)
f(4)   // returns 25

Więc zasadniczo, object(args) jest tylko cukrem składniowym dla object.apply(args).

Jak Scala dokonuje tej konwersji?

Czy zachodzi globalnie zdefiniowana konwersja implicit, podobna do typu implicit konwersje w obiekcie Predef (ale różne w naturze)? Czy to jakaś głębsza Magia? Pytam, ponieważ wygląda na to, że Scala zdecydowanie popiera konsekwentne stosowanie mniejszego zestawu reguł, a nie wielu reguł z wieloma wyjątkami. Początkowo wydaje mi się to wyjątkiem.

Author: Peter Mortensen, 2009-08-03

3 answers

Myślę, że nie dzieje się nic głębszego niż to, co pierwotnie powiedziałeś: to tylko cukier składniowy, dzięki któremu kompilator przekształca f(a) w f.apply(a) jako specjalny przypadek składni.

Może się to wydawać określoną regułą, ale tylko kilka z nich (na przykład z update) pozwala na DSL-podobne konstrukcje i biblioteki.

 67
Author: oxbow_lakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-12 03:06:22

W rzeczywistości jest odwrotnie, obiekt lub klasa z metodą apply jest normalnym przypadkiem, a funkcja jest sposobem na zbudowanie obiektu o tej samej nazwie z metodą apply. W rzeczywistości każda zdefiniowana funkcja jest podobiektem funkcji N (N jest liczbą argumentów).

Zobacz sekcję 6.6:Function Applicationsw specyfikacji języka Scala , aby uzyskać więcej informacji na ten temat.

 20
Author: sebasgo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-05 19:23:43

Pytam, ponieważ wygląda na to, że Scala zdecydowanie popiera konsekwentne stosowanie mniejszego zestawu reguł, a nie wielu reguł z wieloma wyjątkami.

Tak. I ta zasada należy do tego mniejszego zbioru.
 8
Author: Alexey Romanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-03 21:07:40