首页 文章

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

提问于
浏览
79

在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强烈赞成一套较小的规则的一致应用,而不是许多例外的许多规则 . 这最初对我来说似乎是个例外 .

3 回答

  • 20

    我没有比你最初说的更深入了:它只是语法糖,编译器将 f(a) 转换为 f.apply(a) 作为一种特殊的语法案例 .

    这似乎是一个特定的规则,但只有少数(例如,使用 update )允许DSL类似的构造和库 .

  • 64

    实际上是另一种方式,带有apply方法的对象或类是正常情况,而函数是使用apply方法隐式构造同名对象的方法 . 实际上,您定义的每个函数都是Functionn特征的子对象(n是参数的数量) .

    有关该主题的更多信息,请参阅Scala Language Specification第77页的 6.6:Function Applications 部分 .

  • 8

    我问,因为看起来Scala强烈赞成一套较小的规则的一致应用,而不是许多例外的许多规则 .

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

相关问题