Как работает магия метода apply() Scala?


в 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 79

3 ответа:

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

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

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

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

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

да. И это правило относится к этому меньше.