Nunca lo entendí a partir de los nombres inventados de desorden y verbo (¡una AddTwo
clase tiene un apply
que agrega dos!) Ejemplos.
Entiendo que es azúcar sintáctico, por lo que (deduje del contexto) debe haber sido diseñado para hacer que un código sea más intuitivo.
¿Qué significado da una clase con una apply
función? ¿Para qué se utiliza y con qué fines mejora el código (desordenar, sustantivos verbales, etc.)?
¿Cómo ayuda cuando se usa en un objeto complementario?
Respuestas:
Los matemáticos tienen sus propias formas divertidas, así que en lugar de decir "entonces llamamos a la función
f
pasándolax
como parámetro", como diríamos los programadores, hablan de "aplicar la funciónf
a su argumentox
".apply
sirve para cerrar la brecha entre paradigmas orientados a objetos y funcionales en Scala. Cada función en Scala se puede representar como un objeto. Cada función también tiene un tipo OO: por ejemplo, una función que toma unInt
parámetro y devuelve unInt
tipo OO tendráFunction1[Int,Int]
.Dado que todo es un objeto en Scala
f
ahora se puede tratar como una referencia alFunction1[Int,Int]
objeto. Por ejemplo, podemos llamar altoString
método heredado deAny
, eso habría sido imposible para una función pura, porque las funciones no tienen métodos:O podríamos definir otro
Function1[Int,Int]
objeto llamando alcompose
métodof
y encadenando dos funciones diferentes juntas:Ahora, si queremos ejecutar realmente la función, o como dice el matemático "aplicar una función a sus argumentos", llamaríamos al
apply
método en elFunction1[Int,Int]
objeto:Escribir
f.apply(args)
cada vez que desee ejecutar una función representada como un objeto es la forma Orientada a objetos, pero agregaría un montón de desorden al código sin agregar mucha información adicional y sería bueno poder usar una notación más estándar, como comof(args)
. Ahí es donde interviene el compilador Scala y cada vez que tenemos una referenciaf
a un objeto de función y escribimosf (args)
para aplicar argumentos a la función representada, el compilador se expande silenciosamentef (args)
a la llamada al método del objetof.apply (args)
.Cada función en Scala puede tratarse como un objeto y también funciona a la inversa: cada objeto puede tratarse como una función, siempre que tenga el
apply
método. Tales objetos se pueden usar en la notación de función:Hay muchos casos de uso en los que nos gustaría tratar un objeto como una función. El escenario más común es un patrón de fábrica . En lugar de agregar desorden al código usando un método de fábrica, podemos
apply
objetar un conjunto de argumentos para crear una nueva instancia de una clase asociada:Entonces, el
apply
método es solo una forma práctica de cerrar la brecha entre funciones y objetos en Scala.fuente
class Average[YType](yZeroValue:YType)
. ¿Cómo se pasa YType desde su objeto ya que los objetos no pueden tomar parámetros de tipo?apply
yunapply
métodos a un objeto complementario de la clase (entre otras cosas). Así la definición de una clase con sólo una línea como éstacase class Car(make:String, model: String, year: Short, color: String)
hace posible la producción de nuevos objetos de la clase de coche por solo:val myCar = Car("VW","Golf",1999,"Blue")
. Esta es la abreviatura deCar.apply(...)
every object can be treated as a function, provided it has the apply method
- Tanto ahora tiene sentido.Viene de la idea de que a menudo quieres aplicar algo a un objeto. El ejemplo más preciso es el de las fábricas. Cuando tiene una fábrica, desea aplicarle parámetros para crear un objeto.
Los chicos de Scala pensaron que, como ocurre en muchas situaciones, podría ser bueno tener un atajo para llamar
apply
. Por lo tanto, cuando le da parámetros directamente a un objeto, se elimina como si pasara estos parámetros a la función de aplicación de ese objeto:A menudo se usa en objetos complementarios, para proporcionar un buen método de fábrica para una clase o un rasgo, aquí hay un ejemplo:
Desde la biblioteca estándar de scala, puede ver cómo
scala.collection.Seq
se implementa:Seq
es un rasgo, pornew Seq(1, 2)
lo tanto , no se compilará, pero gracias al objeto complementario y la aplicación, puede llamarSeq(1, 2)
y la implementación es elegida por el objeto complementario.fuente
Aquí hay un pequeño ejemplo para aquellos que quieren leer rápidamente
fuente