Як діє магія методу Скала ()?


79

У Scala, якщо я визначаю метод, що викликається applyу класі або об'єкті верхнього рівня, цей метод буде викликаний кожного разу, коли я додаю пару дужок до екземпляра цього класу і поміщаю відповідні аргументи для apply()між ними. Наприклад:

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

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

Отже, в основному, object(args)це просто синтаксичний цукор для object.apply(args).

Як Scala робить це перетворення?

Чи відбувається тут глобально визначене неявне перетворення, подібне до неявних перетворень типу в об’єкті Predef (але різне за своїм характером)? Або це якась глибша магія? Я запитую, тому що, схоже, Scala категорично виступає за послідовне застосування меншого набору правил, а не багатьох правил за багатьма винятками. Спочатку це здається мені винятком.


1
Дуже велике пояснення, stackoverflow.com/questions/9737352/#9738862
Мухаммад Hewedy

Відповіді:


67

Я не думаю, що відбувається щось глибше, ніж те, що ви спочатку сказали: це просто синтаксичний цукор, завдяки якому компілятор перетворюється f(a)на f.apply(a)особливий випадок синтаксису.

Це може здатися конкретним правилом, але лише деякі з них (наприклад, з update) дозволяють створювати DSL- подібні конструкції та бібліотеки.


4
Я б додав "коли fє об'єктом (включаючи функції)". Коли fце метод, такого перекладу, очевидно, немає.
Олексій Романов

2
@AlexeyRomanov: Ну, якщо fце метод, який визначений без списку параметрів, то f(a)справді трактується як щось подібне val _tmp = f; _tmp.apply(a). Але це справді міцно потрапляє на територію розколювання волосся.
Jörg W Mittag

20

Насправді все навпаки, об’єкт або клас із методом apply - це звичайний випадок, а функція - це спосіб неявного побудови об’єкта з тим самим іменем за допомогою методу apply. Насправді кожна визначена вами функція є підоб'єктом ознаки Функції n (n - кількість аргументів).

Зверніться до розділу 6.6: Функція Додаток про специфікації Scala мови для отримання додаткової інформації про тему.


+1 за зміну специфікації мови Scala. Я додав потрібне місце, оскільки номер вашої сторінки застарілий.
Alexandre Martins

8

Я запитую, тому що, схоже, Scala категорично виступає за послідовне застосування меншого набору правил, а не багатьох правил за багатьма винятками.

Так. І це правило належить до цього меншого набору.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.