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.
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.
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.
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
Tak. I ta zasada należy do tego mniejszego zbioru.Pytam, ponieważ wygląda na to, że Scala zdecydowanie popiera konsekwentne stosowanie mniejszego zestawu reguł, a nie wielu reguł z wieloma wyjątkami.
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