在 Scala 中,如果我在类或顶级对象中定义了一个名为 apply
的方法,则每当我将一对括号附加到该类的实例时,就会调用该方法,并且将 apply()
的适当参数放在它们之间。例如:
class Foo(x: Int) {
def apply(y: Int) = {
x*x + y*y
}
}
val f = new Foo(3)
f(4) // returns 25
所以基本上,object(args)
只是 object.apply(args)
的语法糖。
Scala 如何进行这种转换?
这里是否存在全局定义的隐式转换,类似于 Predef 对象中的隐式类型转换(但种类不同)?或者是某种更深层次的魔法?我问这个问题是因为 Scala 似乎强烈支持一致应用较小的一组规则,而不是带有许多异常(exception)的许多规则。最初这对我来说似乎是一个异常(exception)。
最佳答案
我认为没有比你最初所说的更深入的事情了:这只是编译器转换 f(a)
的语法糖。进入f.apply(a)
作为特殊的语法情况。
这可能看起来像是一个特定的规则,但其中只有少数(例如, update
)允许 DSL -类似的结构和库。
关于scala - Scala 的 apply() 方法魔法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223834/