Как работает волшебство метода apply () в Scala? - PullRequest
79 голосов
/ 03 августа 2009

В 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 решительно выступает за последовательное применение меньшего набора правил, а не многих правил со многими исключениями. Изначально это кажется мне исключением.

Ответы [ 3 ]

65 голосов
/ 03 августа 2009

Я не думаю, что происходит что-то более глубокое, чем то, что вы изначально сказали: это просто синтаксический сахар, посредством которого компилятор преобразует f(a) в f.apply(a) в качестве особого синтаксического случая.

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

20 голосов
/ 03 августа 2009

На самом деле все наоборот, объект или класс с методом apply - это нормальный случай, а функция - способ неявного создания объекта с тем же именем с помощью метода apply. Фактически каждая функция, которую вы определяете, является подобъектом функции n (n - количество аргументов).

См. Раздел 6.6: Приложения функций на странице 77 спецификации языка Scala для получения дополнительной информации по теме.

8 голосов
/ 04 августа 2009

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

Да. И это правило принадлежит этому меньшему набору.

...