Scala 的 application()方法魔法是如何工作的?

在 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 似乎非常支持使用一组较小的规则,而不是使用许多例外情况下的规则。这在我看来似乎是个例外。

32255 次浏览

实际上恰恰相反,一个对象或类使用一个 application 方法是正常的情况,而函数是使用 application 方法隐式构造一个同名对象的方法。实际上,您定义的每个函数都是 FunctionN trait 的子对象(n 是参数的数量)。

关于这个主题的更多信息,请参阅 Scala 语言规范6.6: 函数应用部分。

我不认为有什么比你最初说的更深入的东西: 它只是语法糖,编译器将 f(a)转换成 f.apply(a)作为一个特殊的语法情况。

这可能看起来像是一个特定的规则,但是只有少数规则(例如,使用 update)允许类似于 DSL的构造和库。

我之所以这样问,是因为 Scala 似乎非常支持使用一组较小的规则,而不是使用许多例外情况下的规则。

是的,这条规则属于这个小集合。