Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scala中创建新对象后的代码块_Scala_Constructor - Fatal编程技术网

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

在scala中创建新对象后的代码块,scala,constructor,Scala,Constructor,我有一个构造函数定义为 class Test{ var i = 0; println("constructor"); } 我称之为 val t = new Test { println("codeblock"); i = 7; } 其结果是: constructor codeblock defined class Test t: Test = $anon$1@4a7b4f79 res3: Int = 7 因此,我看到与new位于同一行的代码块被执行,就好像它是构造函数的一部分一样。我对此不

我有一个构造函数定义为

class Test{ var i = 0; println("constructor"); }
我称之为

val t = new Test { println("codeblock"); i = 7; }
其结果是:

constructor
codeblock
defined class Test
t: Test = $anon$1@4a7b4f79
res3: Int = 7
因此,我看到与new位于同一行的代码块被执行,就好像它是构造函数的一部分一样。我对此不熟悉


有人能澄清这种行为和/或指出解释这里语义的参考吗?我不知道如何用谷歌搜索这个——在构造函数调用scala的同一行中查找
代码块没有多大帮助

大致相当于:

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
所以您可以看到初始化顺序从更抽象的类到更具体的类


要突出显示@som snytt指向Scala语言规范的注释:

ah,这就是类型为
$anon$
的原因。为什么这比
val t=新测试更好;t、 i=7
?这不是更好或更糟-选择的方法取决于您的任务。我记得在Java中,它们通常在构造函数中初始化东西。从Scala的角度来看,在大多数情况下没有必要使用
var
——您可以用不可变数据(VAL、case类)替换它。然而,一些Java风格的依赖项可能需要适当的初始化(这时只鼓励使用常规类,而不是“case”类);日志记录是另一个很好的例子。谢谢。查看scalafx代码时遇到此问题。@som snyt未看到。这难道不意味着当
newsometype{…}
初始化时会发生refection吗?@divbyzero只有在“new”期间添加一些新成员时才会发生refection,它们(成员)将被反射访问,并且您将看到警告。自2.12.1 scala起。这就是我所说的“大致等效”的意思,如果TestImpl有一些新成员,那么您实际上会得到一个结构类型测试{def newMember}作为您的res8的一种类型。还有,谢谢!看起来很有趣。