代码之家  ›  专栏  ›  技术社区  ›  Mandroid

scala:类中有默认的应用方法吗?

  •  2
  • Mandroid  · 技术社区  · 3 年前

    scala是否为类提供了默认的应用方法?

    我有一节课:

    class Player(tea: String, sal: Int = 0) {
        val team  = tea
        private val salary = sal
    }
    

    所以这里没有应用方法,我还没有为它定义任何伴随对象,所以这里也没有应用方法。

    但我能够做到:

    val player = Player("AAAA", 1000)
    

    由于没有使用“new”运算符,我理解这行代码必须调用一些应用方法。但我没有定义。那么它是如何工作的呢?

    1 回复  |  直到 3 年前
        1
  •  4
  •   Guru Stron    3 年前

    是的,从Scala 3开始,如 docs :

    Scala案例类生成应用方法,因此案例类的值可以使用简单的函数应用程序创建,而无需编写 new .

    Scala3将这个方案推广到所有具体的类。实例

    class StringBuilder(s: String):
      def this() = this("")
    
    StringBuilder("abc")  // old: new StringBuilder("abc")
    StringBuilder()       // old: new StringBuilder()
    

    这是因为带有两个应用方法的伴随对象是与类一起生成的。对象如下所示:

    object StringBuilder:
      inline def apply(s: String): StringBuilder = new StringBuilder(s)
      inline def apply(): StringBuilder = new StringBuilder()
    

    合成对象StringBuilder及其应用方法称为构造函数代理。构造函数代理甚至是为Java类和来自Scala2的类生成的。具体规则如下:

    1. 构造函数代理伴随对象 object C 是为混凝土类创建的 C ,前提是该类还没有同伴,并且也没有其他名为的值或方法 C 在其中的范围中定义或继承 C 定义了。
    2. 构造函数代理 apply 为提供的具体类生成方法
      • 该类具有一个伴随对象(可能已在步骤1中生成),以及
      • 该伴随对象尚未定义名为的成员 申请 .

    每个生成 申请 方法转发到类的一个构造函数。它具有与构造函数相同的类型和值参数。

    推荐文章