如何Scala的适用()方法魔法的工作?(How does Scala's apply()

2019-06-18 00:03发布

在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)

如何斯卡拉做到这一点的转换?

是否有一个全局定义的隐式转换会在这里,类似于PREDEF对象的隐式类型转换(但实物不同)? 或者是一些更深层的魔力? 我问,因为它看起来像斯卡拉强烈支持较小的一套规则的一致应用,而不是许多例外许多规则。 这最初似乎是一个例外给我。

Answer 1:

我不认为有什么更深的事情比你原本说:这只是语法糖,从而编译转换f(a)进入f.apply(a)作为一种特殊的语法情况。

这似乎是一个特定的规则,但只有其中的一些(例如,用update )允许DSL式的结构和库。



Answer 2:

它实际上是周围的其他方法,对象或类的应用方法是在正常情况下和一个功能是隐式构建与应用方法相同名称的对象的方式。 其实每一次你定义功能的函数特质的子对象(n为参数的个数)。

参见6.6:功能应用的第77页的Scala语言规范为主题的更多信息。



Answer 3:

我问,因为它看起来像斯卡拉强烈支持较小的一套规则的一致应用,而不是许多例外许多规则。

是。 而这个规则就属于这一小集。



文章来源: How does Scala's apply() method magic work?