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