我从来没有从人工编组和动词名词(一个AddTwo类有一个添加两个的应用程序!)示例中理解它。

我知道它是语法糖,所以(我从上下文推断)它一定是为了使一些代码更直观而设计的。

具有apply函数的类具有什么意义?它的用途是什么,它使代码更好的目的是什么(解组、动词名词等)?

它在伴生对象中使用时有什么帮助?


当前回答

简单地说,

您可以将其视为custom()操作符。如果类X有apply()方法,那么无论何时调用X(),都将调用apply()方法。

其他回答

这里有一个小例子,供那些想要快速阅读的人使用

 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")


} 

输出 使用消息hello实例化了一个greeting -1 使用消息世界实例化了一个greeting -2

来自c++的人的TLDR

它只是重载操作符()括号

在scala中:

class X {
   def apply(param1: Int, param2: Int, param3: Int) : Int = {
     // Do something
   }
}

在c++中与此相同:

class X {
   int operator()(int param1, int param2, int param3) {
      // do something
   }
};

apply方法将对象转换为函数。我们希望能够使用函数语法,例如:

f (args)

但是Scala同时拥有函数语法和面向对象语法。其中一个必须是语言的基础。Scala(出于各种原因)选择面向对象作为语言的基本形式。这意味着任何函数语法都必须转换为面向对象的语法。

这就是应用的用武之地。任何具有apply方法的对象都可以使用以下语法:

f (args)

然后scala基础架构将其转换为

f.apply (args)

F.apply (args)具有正确的面向对象语法。如果对象没有apply方法,则不可能执行此转换!

简而言之,在对象中使用apply方法可以让Scala将语法:object(args)转换为语法:object.apply(args)。而object.apply(args)则处于可以执行的表单中。

供你参考,这意味着scala中的所有函数都是对象。它还暗示了apply方法是使对象成为函数的原因!

查看公认的答案,了解函数是如何成为对象的,以及可以作为对象使用的技巧。

它来自于你经常想要将某些东西应用到一个对象上的想法。更准确的例子是工厂。当您有一个工厂时,您希望向其应用参数以创建一个对象。

Scala的人认为,在许多情况下,有一个调用apply的快捷方式会很好。因此,当你直接给一个对象参数时,它就像你把这些参数传递给该对象的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提供一个很好的工厂方法,下面是一个例子:

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是一个trait,因此新的Seq(1,2)不会被编译,但是由于伴生对象和apply,你可以调用Seq(1,2),实现由伴生对象选择。

1 -将函数视为对象。

apply方法类似于Python中的__call __,它允许你使用给定类的实例作为函数。