¿Cómo funciona Scala’s apply () magic?

En Scala, si defino un método llamado apply en una clase o un objeto de nivel superior, se llamará a ese método cada vez que agregue un par entre paréntesis a una instancia de esa clase, y coloque los argumentos apropiados para apply() en el medio ellos. Por ejemplo:

 class Foo(x: Int) { def apply(y: Int) = { x*x + y*y } } val f = new Foo(3) f(4) // returns 25 

Entonces, básicamente, el object(args) es solo azúcar sintáctica para object.apply(args) .

¿Cómo hace Scala esta conversión?

¿Hay una conversión implícita definida globalmente aquí, similar a las conversiones de tipo implícitas en el objeto Predef (pero diferente en tipo)? ¿O es una magia más profunda? Lo pregunto porque parece que Scala está a favor de la aplicación consistente de un conjunto de reglas más pequeño, en lugar de muchas reglas con muchas excepciones. Esto inicialmente me parece una excepción.

    No creo que haya nada más profundo que lo que has dicho originalmente: es solo azúcar sintáctico mediante el cual el comstackdor convierte f(a) en f.apply(a) como un caso de syntax especial.

    Esto podría parecer una regla específica, pero solo unas pocas (por ejemplo, con la update ) permiten construcciones y bibliotecas de tipo DSL .

    En realidad, es al revés, un objeto o clase con un método apply es el caso normal y una función es la forma de construir implícitamente un objeto del mismo nombre con un método apply. En realidad, cada función que define es un subobjeto del rasgo Función n (n es el número de argumentos).

    Consulte la sección 6.6: Aplicaciones de funciones en la página 77 de la Especificación del lenguaje Scala para obtener más información sobre el tema.

    Lo pregunto porque parece que Scala está a favor de la aplicación consistente de un conjunto de reglas más pequeño, en lugar de muchas reglas con muchas excepciones.

    Sí. Y esta regla pertenece a este conjunto más pequeño.