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