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

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

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

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


当前回答

来自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方法是使对象成为函数的原因!

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

1 -将函数视为对象。

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

来自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
   }
};

简单地说,

您可以将其视为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