Los matemáticos tienen sus propias formas divertidas, así que en lugar de decir "entonces llamamos a la función fpasándola xcomo parámetro", como diríamos los programadores, hablan de "aplicar la función fa su argumento x".
En matemáticas e informática, Apply es una función que aplica funciones a argumentos.
Wikipedia
applysirve 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 un Intparámetro y devuelve un Inttipo OO tendrá Function1[Int,Int].
// define a function in scala
(x:Int) => x + 1
// assign an object representing the function to a variable
val f = (x:Int) => x + 1
Dado que todo es un objeto en Scala fahora se puede tratar como una referencia al Function1[Int,Int]objeto. Por ejemplo, podemos llamar al toStringmétodo heredado de Any, eso habría sido imposible para una función pura, porque las funciones no tienen métodos:
f.toString
O podríamos definir otro Function1[Int,Int]objeto llamando al composemétodo fy encadenando dos funciones diferentes juntas:
val f2 = f.compose((x:Int) => x - 1)
Ahora, si queremos ejecutar realmente la función, o como dice el matemático "aplicar una función a sus argumentos", llamaríamos al applymétodo en el Function1[Int,Int]objeto:
f2.apply(2)
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 como f(args). Ahí es donde interviene el compilador Scala y cada vez que tenemos una referencia fa un objeto de función y escribimos f (args)para aplicar argumentos a la función representada, el compilador se expande silenciosamente f (args)a la llamada al método del objeto f.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 applymétodo. Tales objetos se pueden usar en la notación de función:
// we will be able to use this object as a function, as well as an object
object Foo {
var y = 5
def apply (x: Int) = x + y
}
Foo (1) // using Foo object in function notation
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 applyobjetar un conjunto de argumentos para crear una nueva instancia de una clase asociada:
List(1,2,3) // same as List.apply(1,2,3) but less clutter, functional notation
// the way the factory method invocation would have looked
// in other languages with OO notation - needless clutter
List.instanceOf(1,2,3)
Entonces, el applymétodo es solo una forma práctica de cerrar la brecha entre funciones y objetos en Scala.