Los matemáticos tienen sus propias formas divertidas, así que en lugar de decir "entonces llamamos a la función f
pasándola x
como parámetro", como diríamos los programadores, hablan de "aplicar la función f
a su argumento x
".
En matemáticas e informática, Apply es una función que aplica funciones a argumentos.
Wikipedia
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 un Int
parámetro y devuelve un Int
tipo 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 f
ahora se puede tratar como una referencia al Function1[Int,Int]
objeto. Por ejemplo, podemos llamar al toString
mé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 compose
método f
y 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 apply
mé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 f
a 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 apply
mé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 apply
objetar 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 apply
método es solo una forma práctica de cerrar la brecha entre funciones y objetos en Scala.