Математика имеет свои собственные маленькие смешные пути, так что вместо того, чтобы говорить «то мы называем функцию f
Попутно x
в качестве параметра», как сказали бы мы, программисты, они говорят о «применении функции f
к своему аргументу x
».
В математике и информатике Применить - это функция, которая применяет функции к аргументам .
Wikipedia
apply
служит для закрытия зазора между объектно-ориентированным и функциональными парадигмами в Scala. Каждая функция в Scala может быть представлена как объект. Каждая функция также имеет тип OO: например, функция, которая принимает параметр Int
и возвращает Int
, будет иметь тип 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
Так как все является объектом в Scala f
теперь может рассматриваться как ссылка на Function1[Int,Int]
объекта.Например, мы можем назвать toString
метод, унаследованный от Any
, что было бы невозможно для чистой функции, поскольку функции не имеют методы:
f.toString
Или мы могли бы определить другой Function1[Int,Int]
объект с помощью вызова метода compose
на f
и цепочки две различные функции вместе:
val f2 = f.compose((x:Int) => x - 1)
Теперь, если мы действительно хотим выполнить функцию или математиком сказать «применить функцию к аргументам» мы назвали бы метод apply
на Function1[Int,Int]
объект:
f2.apply(2)
Запись f.apply(args)
каждый раз, когда вы хотите, чтобы выполнить функцию, представленную в качестве объекта является объектно-ориентированный путь, но хотел бы добавить много беспорядка в коде без добавления много дополнительной информации, и было бы приятно иметь возможность использовать более стандартную нотацию, такую как f(args)
. Вот где компилятор Scala работает и всякий раз, когда у нас есть ссылка f
на объект функции и записывается f (args)
для применения аргументов к представленной функции, компилятор молча расширяет f (args)
до вызова метода объекта f.apply (args)
.
Каждая функция в Scala может рассматриваться как объект, и она работает и наоборот - каждый объект может рассматриваться как функция при условии, что он имеет метод apply
. Такие объекты могут быть использованы в функции обозначения:
// 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
Есть много случаев использования, когда мы хотели бы рассматривать объект как функцию. Наиболее распространенным сценарием является factory pattern. Вместо добавление помех к коде с помощью метода производства возможен apply
объекта к набору аргументов, чтобы создать новый экземпляр ассоциированного класса:
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)
Так apply
метода является просто удобным способом ликвидировать разрыв между функций и объектов в Scala.
Даже быстрый поиск в Google приносит много хорошие статьи. Вот один из них: http://jackcoughonsoftware.blogspot.com/2009/01/deeper-look-at-apply-method-in-scala.html –
http://stackoverflow.com/questions/1223834/how-does- scalas-apply-method-magic-work – ses
Фактически это то же самое, что и конструктор в Java/C++, но может возвращать значение и имеет «применить» имя – ses