Что такое функция apply в Scala?
Я никогда не понимал его от надуманных немаршалинга и verbing существительных ( с AddTwo классе apply что добавляет два!) образцы.
Я понимаю, что это синтаксический сахар, поэтому (я вывел из контекста) он должен был быть разработан, чтобы сделать какой-то код более интуитивным.
какое значение имеет класс с
3 ответа:
у математиков есть свои маленькие странности, вместо того, чтобы сказать "тогда мы называем функцию
fпередав ейxв качестве параметра "как сказали бы мы, программисты, они говорят о" применении функцииfего аргументx".в математике и информатике Apply-это функция, которая применяется функции для Аргументов.
Википедия
applyслужит цели сокращение разрыва между объектно-ориентированной и функциональной парадигмами в Scala. Каждая функция в Scala может быть представлена как объект. Каждая функция также имеет тип OO: например, функция, которая принимаетIntпараметр и возвращаетIntбудет иметь ОО тип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теперь можно рассматривать как ссылку на
это происходит от идеи, что вы часто хотите применить что-то к объекту. Более точным примером является один из заводов. Когда у вас есть завод, вы хотите применить параметр к нему для создания объекта.
ребята из Scala подумали, что, как это происходит во многих ситуациях, было бы неплохо иметь ярлык для вызова
apply. Таким образом, когда вы даете параметры непосредственно на объект, это обессахаренный, как если бы вы передать эти параметры в применить функция этого объекта:class MyAdder(x: Int) { def apply(y: Int) = x + y } val adder = new MyAdder(2) val result = adder(4) // equivalent to x.apply(4)он часто используется в сопутствующем объекте, чтобы обеспечить хороший заводской метод для класса или признака, вот пример:
trait A { val x: Int def myComplexStrategy: Int } object A { def apply(x: Int): A = new MyA(x) private class MyA(val x: Int) extends A { val myComplexStrategy = 42 } }из стандартной библиотеки scala вы можете посмотреть, как
scala.collection.Seqреализуется:Seq- черта, таким образомnew Seq(1, 2)не будет компилироваться, но благодаря companion object и apply, вы можете вызватьSeq(1, 2)и реализация выбирается сопутствующим объектом.
вот небольшой пример для тех, кто хочет знакомиться быстро
object ApplyExample01 extends App { class Greeter1(var message: String) { println("A greeter-1 is being instantiated with message " + message) } class Greeter2 { def apply(message: String) = { println("A greeter-2 is being instantiated with message " + message) } } val g1: Greeter1 = new Greeter1("hello") val g2: Greeter2 = new Greeter2() g2("world") }выход
создается экземпляр greeter-1 с сообщением hello
экземпляр greeter-2 создается с помощью message world