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强烈支持一套小规则的应用,而不是很多例外。
是。 而这个规则属于这个较小的集合。