Scala是否具有像C#这样的对象初始化?

时间:2011-09-18 10:56:36

标签: scala object initialization

C#中的对象初始化:

var foo = new Foo() { bar = 5 };

相当于

var foo = new Foo();
foo.bar = 5;

Scala是否具有像C#这样的对象初始化?

2 个答案:

答案 0 :(得分:16)

scala> class Foo { var bar: Int = _ }
defined class Foo

scala> var foo = new Foo() { bar = 5 }
foo: Foo = $anon$1@1ed00d1

scala> var realFoo = new Foo()
realFoo: Foo = Foo@1bedb0

您可以看到语法有效(在本例中),但foo也没有Foo类型。它实际上是Foo的一个新子类型,它将它与大括号之间的任何子类化。在这种情况下,只是带有附加赋值的构造函数。

在一般情况下,确切的C#语法不起作用:

scala> class Foo { var bar: Int = _; var baz: String = _ }
defined class Foo

scala> var foo: Foo = new Foo { bar = 5, baz = "bam" }
<console>:1: error: ';' expected but ',' found.
       var foo: Foo = new Foo { bar = 5, baz = "bam" }

相反,您需要输入:

scala> var foo: Foo = new Foo { bar = 5; baz = "bam" }
foo: Foo = $anon$1@1be20c

首先运行Foo构造函数,然后运行匿名类型构造函数。

我认为这是Kim和Alexey的评论所指的。

我不使用C#,但似乎在C#中,这一段语法只能用于初始化字段,而在Scala中,决定使用这种语法来扩展类,就像在Java中一样。

答案 1 :(得分:6)

Scala没有像C#这样的对象初始化,但Scala大多数时候都不需要它。集合有工厂方法,可以轻松替换C#集合的对象初始化。 案例类带有复制方法,这有助于初始化其余对象。有匿名类,它有助于扩展一个类并同时用它的所有成员初始化一个类的实例。