W Scali, jeśli zdefiniuję metodę wywołaną apply
w klasie lub obiekcie najwyższego poziomu, ta metoda zostanie wywołana za każdym razem, gdy dodam parę nawiasów do instancji tej klasy i umieszczę odpowiednie argumenty apply()
pomiędzy nimi. Na przykład:
class Foo(x: Int) {
def apply(y: Int) = {
x*x + y*y
}
}
val f = new Foo(3)
f(4) // returns 25
Zasadniczo object(args)
jest to po prostu cukier syntaktyczny object.apply(args)
.
Jak Scala dokonuje tej konwersji?
Czy zachodzi tutaj globalnie zdefiniowana niejawna konwersja, podobna do niejawnych konwersji typu w obiekcie Predef (ale innego rodzaju)? A może to głębsza magia? Pytam, ponieważ wydaje się, że Scala zdecydowanie opowiada się za konsekwentnym stosowaniem mniejszego zestawu reguł, a nie wielu reguł z wieloma wyjątkami. Początkowo wydaje mi się to wyjątkiem.