Scala如何应用()方法的魔术工作?

在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对象中的隐式types转换(但types不同)? 或者是更深层次的魔法? 我问,因为看起来Scala强烈支持一套小规则的应用,而不是很多例外的规则。 这对我来说似乎是一个例外。

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

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

实际上,反过来,具有apply方法的对象或类是正常情况,函数是用apply方法隐式构造同名对象的方法。 实际上,你定义的每个函数都是Function n特性的子对象(n是参数个数)。

有关该主题的更多信息,请参阅Scala语言规范第77页上的第6.6节“ 函数应用程序 ”。

我问,因为看起来Scala强烈支持一套小规则的应用,而不是很多例外。

是。 而这个规则属于这个较小的集合。