C#中的对象初始化:
var foo = new Foo() { bar = 5 };
相当于
var foo = new Foo();
foo.bar = 5;
Scala是否具有像C#这样的对象初始化?
答案 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#集合的对象初始化。 案例类带有复制方法,这有助于初始化其余对象。有匿名类,它有助于扩展一个类并同时用它的所有成员初始化一个类的实例。