Что такое функция apply в Scala?


Я никогда не понимал его от надуманных немаршалинга и verbing существительных ( с AddTwo классе apply что добавляет два!) образцы.

Я понимаю, что это синтаксический сахар, поэтому (я вывел из контекста) он должен был быть разработан, чтобы сделать какой-то код более интуитивным.

какое значение имеет класс с

3 248

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