Инициализация объекта в С#:
var foo = new Foo() { bar = 5 };
что эквивалентно
var foo = new Foo();
foo.bar = 5;
Есть ли Scala инициализация объекта, такая как С#?
Инициализация объекта в С#:
var foo = new Foo() { bar = 5 };
что эквивалентно
var foo = new Foo();
foo.bar = 5;
Есть ли Scala инициализация объекта, такая как С#?
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.
Scala не имеет инициализации объекта, такой как С#, но Scala не нуждается в нем большую часть времени. Существуют методы factory для коллекций, которые могут легко заменить инициализацию объектов коллекций С#. Существуют классы case с методами копирования, которые помогают с инициализацией остальных объектов. Существуют анонимные классы, которые помогают расширить класс и инициализировать экземпляр класса со всеми его членами одновременно.