Os matemáticos têm suas próprias maneiras engraçadas, então, em vez de dizer "então chamamos a função f
passando x
como parâmetro", como diríamos os programadores, eles falam sobre "aplicar a função f
ao seu argumento x
".
Em matemática e ciência da computação, Apply é uma função que aplica funções a argumentos.
Wikipedia
apply
serve ao propósito de fechar a lacuna entre paradigmas orientados a objetos e funcionais em Scala. Toda função no Scala pode ser representada como um objeto. Toda função também possui um tipo OO: por exemplo, uma função que pega um Int
parâmetro e retorna um Int
terá o tipo OO 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
Como tudo é um objeto no Scala f
agora pode ser tratado como uma referência ao Function1[Int,Int]
objeto. Por exemplo, podemos chamar o toString
método herdado de Any
, que seria impossível para uma função pura, porque funções não possuem métodos:
f.toString
Ou podemos definir outro Function1[Int,Int]
objeto chamando o compose
método f
e encadeando duas funções diferentes:
val f2 = f.compose((x:Int) => x - 1)
Agora, se queremos realmente executar a função, ou, como matemático diz "aplicar uma função aos seus argumentos", chamaríamos o apply
método no Function1[Int,Int]
objeto:
f2.apply(2)
Escrever f.apply(args)
toda vez que você deseja executar uma função representada como um objeto é a maneira Orientada a Objetos, mas adicionaria muita confusão ao código sem adicionar muita informação adicional e seria bom poder usar uma notação mais padrão, como como f(args)
. É aí que o compilador Scala intervém e sempre que temos uma referência f
a um objeto de função e escrevemos f (args)
para aplicar argumentos à função representada, o compilador se expande silenciosamente f (args)
para a chamada do método de objeto f.apply (args)
.
Toda função no Scala pode ser tratada como um objeto e funciona da outra maneira - todo objeto pode ser tratado como uma função, desde que tenha o apply
método. Tais objetos podem ser usados na notação de função:
// 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
Existem muitos casos de uso em que queremos tratar um objeto como uma função. O cenário mais comum é um padrão de fábrica . Em vez de adicionar confusão ao código usando um método factory, podemos apply
objetar um conjunto de argumentos para criar uma nova instância de uma classe associada:
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)
Portanto, o apply
método é apenas uma maneira útil de fechar a lacuna entre funções e objetos no Scala.