Как работает магия метода 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 ответов
Я не думаю, что есть что-то более глубокое, чем то, что вы изначально сказали: это просто синтаксический сахар, посредством которого компилятор преобразует f(a)
на f.apply(a)
как особый синтаксический случай.
Это может показаться определенным правилом, но только некоторые из них (например, с update
) позволяет DSL - как конструкции и библиотеки.
на самом деле наоборот, объект или класс с методом apply является нормальным случаем, а функция-способом неявного построения объекта с тем же именем с помощью метода apply. Фактически каждая функция, которую вы определяете, является подобъектом функцииn черта (n-количество аргументов).
раздел 6.6:Функция на странице 77 Спецификация Языка Scala для получения дополнительной информации тема.
Я спрашиваю, потому что кажется, что Scala сильно поддерживает последовательное применение меньшего набора правил, а не многих правил со многими исключениями.
да. И это правило принадлежит к этому меньшему набору.