¿Cuál es la diferencia entre una definición de función Scala que utiliza “object myfunction extend (int => int) {def apply (n: int) {…}}” y “def myfunction (n: int) {}”?

El primero es un truco para definir un método estático sin ser miembro de ninguna otra clase gobernante (contenedor). En realidad, ‘myfunction’ es un Object (un singleton) que implementa el método ‘apply ()’ permitiendo así que ‘myfunction ()’ llame semánticamente. Y una ilustración de funciones de primera clase en Scala [1] a través de la extensión literal `int => int ‘. (pura genialidad).

Este último no se compilará en absoluto si no es miembro de otro objeto y recuerde que no hay métodos estáticos en Scala. (Hay algo mejor).

Entonces, en lugar de tener un contenedor, ¿por qué no hacemos que nuestro método estático sea “autocontenido” ? El primero es un método estático autónomo. Si no tuviéramos esta flexibilidad en Scala, la implementación de un método estático sería tener un objeto complementario [2] (o un objeto de utilidad de propósito general) e implementar el método allí. Un código de muestra a continuación.

Definición:

  Objeto Utilidades {
     def mifunción (n: Int): Int = {
         // haciendo algo realmente importante aquí.
         // negocio serio. 
     }
 }

Uso:

  val seriousResult = Utilities.myfunction (42);

[1] Programación en Scala – Odersky, Spoon, Venners – Página 177, Sección 8.3 “Funciones de primera clase”

[2] Programación en Scala – Odersky, Spoon, Venners – Página 99, Sección 4.3 “Objetos Singleton”

Los métodos Scala (“defs”) son como los métodos Java. Scala también tiene objetos de función, que en realidad son solo objetos con un método de “aplicación”. Sin embargo, el compilador anObject.apply(foo) a anObject.apply(foo) , por lo que puede “llamar” a un método o un objeto cuyo nombre esté dentro del alcance, con la misma sintaxis.