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

gre*_*man 12 scala initialization object

C#中的对象初始化:

var foo = new Foo() { bar = 5 };
Run Code Online (Sandbox Code Playgroud)

相当于

var foo = new Foo();
foo.bar = 5;
Run Code Online (Sandbox Code Playgroud)

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

huy*_*hjl 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
Run Code Online (Sandbox Code Playgroud)

您可以看到语法有效(在本例中),但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" }
Run Code Online (Sandbox Code Playgroud)

相反,你需要输入:

scala> var foo: Foo = new Foo { bar = 5; baz = "bam" }
foo: Foo = $anon$1@1be20c
Run Code Online (Sandbox Code Playgroud)

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

我认为这是Kim和Alexey评论所指的内容.

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


agi*_*eel 6

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