Подтвердить что ты не робот

Имеет ли Scala инициализацию объекта, например С#?

Инициализация объекта в С#:

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

что эквивалентно

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

Есть ли Scala инициализация объекта, такая как С#?

4b9b3361

Ответ 1

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

scala> var foo = new Foo() { bar = 5 }
foo: Foo = [email protected]

scala> var realFoo = new Foo()
realFoo: Foo = [email protected]

Вы можете видеть, что синтаксис работает (в данном случае), но также и что foo не имеет типа Foo. Это фактически новый подтип Foo, который подклассифицирует его тем, что находится между фигурными скобками. В этом случае только конструктор с дополнительным присваиванием.

В общем случае точный синтаксис С# не будет работать:

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 = [email protected]

Сначала будет запускаться конструктор Foo, затем будет запускаться конструктор анонимного типа.

Я думаю, что это то, о чем комментируют Ким и Алексей.

Я не использую С#, но, похоже, в С# этот бит синтаксиса можно использовать только для инициализации полей, а в Scala было решено использовать этот синтаксис для расширения класса, как в Java.

Ответ 2

Scala не имеет инициализации объекта, такой как С#, но Scala не нуждается в нем большую часть времени. Существуют методы factory для коллекций, которые могут легко заменить инициализацию объектов коллекций С#. Существуют классы case с методами копирования, которые помогают с инициализацией остальных объектов. Существуют анонимные классы, которые помогают расширить класс и инициализировать экземпляр класса со всеми его членами одновременно.