我从来没有从人工编组和动词名词(一个AddTwo类有一个添加两个的应用程序!)示例中理解它。
我知道它是语法糖,所以(我从上下文推断)它一定是为了使一些代码更直观而设计的。
具有apply函数的类具有什么意义?它的用途是什么,它使代码更好的目的是什么(解组、动词名词等)?
它在伴生对象中使用时有什么帮助?
我从来没有从人工编组和动词名词(一个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 __,它允许你使用给定类的实例作为函数。