2009-08-03 20 views
76

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 añada un par entre paréntesis a una instancia de esa clase, y coloque los argumentos apropiados para apply() en medio ellos. Por ejemplo:¿Cómo funciona Scala's apply() magic?

class Foo(x: Int) { 
    def apply(y: Int) = { 
     x*x + y*y 
    } 
} 

val f = new Foo(3) 
f(4) // returns 25 

Así que, básicamente, object(args) es sólo azúcar sintáctica para object.apply(args).

¿Cómo hace Scala esta conversión?

¿Hay aquí una conversión implícita definida globalmente, 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.

+1

Muy buena explicación, http://stackoverflow.com/questions/9737352/#9738862 –

Respuesta

62

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

Esto podría parecer una regla específica, pero solo algunas de ellas (por ejemplo, con update) permiten construcciones y bibliotecas similares a DSL.

+0

Si intercambia f (a) y f.apply (a) es correcto;) – sebasgo

+2

Creo que tenía razón la primera vez ;-P –

+4

Agregaría "cuando' f' es un objeto (incluidas las funciones) " . Cuando 'f' es un método, obviamente no hay tal traducción. –

19

En realidad, 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 defina es un subobjeto de la función n rasgo (n es el número de argumentos).

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

+0

+1 para cambiar la especificación de idioma de Scala. Agregué la ubicación correcta ya que su número de página no está actualizado. –

7

Lo pregunto porque parece que Scala favorece fuertemente 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.

Cuestiones relacionadas