Есть ли в Scala инициализация объекта, как в C #? - PullRequest
12 голосов
/ 18 сентября 2011

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

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

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

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

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

Ответы [ 2 ]

16 голосов
/ 18 сентября 2011
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, затем - конструктор анонимного типа.

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

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

6 голосов
/ 18 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...