Что такое функция 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