在Scala中创建新对象后的代码块

div*_*ero 3 constructor scala

我有一个构造函数定义为

class Test{ var i = 0; println("constructor"); }
Run Code Online (Sandbox Code Playgroud)

我称之为

val t = new Test { println("codeblock"); i = 7; }
Run Code Online (Sandbox Code Playgroud)

结果是:

constructor
codeblock
defined class Test
t: Test = $anon$1@4a7b4f79
res3: Int = 7
Run Code Online (Sandbox Code Playgroud)

因此,我看到与new在同一行上的代码块被执行,就好像它是构造函数的一部分一样。我对此并不熟悉。

有人可以澄清这种行为和/或指向参考来解释此处的语义吗?我不确定如何使用Google进行搜索-寻找code block on same line as constructor call scala无济于事。

dk1*_*k14 5

大致相当于:

class Test{ var i = 0; println("constructor"); }

class TestImpl extends Test {
  println("codeblock")
  i = 7
}

scala> new TestImpl
constructor
codeblock
res8: TestImpl = TestImpl@6baf697c

scala> res8.i
res9: Int = 7
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到初始化顺序从更抽象到更具体的类。

突出显示@ som-snytt的指向Scala语言规范的注释:通用实例创建表达式