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