2015-12-14 1 views
1

Я знаю, что мы не можем получить этот эффект, определив самим метод apply() на сопутствующем объекте, но для всех целей единственное, что я вижу в кодовых базах Scala, это то, что каждый будет просто определять методы apply() для каждого из их классы, что приводит к большому шаблону.Почему Scala не позволяет создать экземпляр класса без использования «нового» оператора?

F #, например, позволит создавать объекты без новых по умолчанию (кроме одноразовых).

Есть ли причина для этого решения?

+1

Вы можете создать экземпляр класса case без использования новых. http://docs.scala-lang.org/tutorials/tour/case-classes.html – Simon

+0

С помощью классов case сопутствующий объект и метод apply применяются для вас автоматически, поэтому вам не нужно его писать сам. – Jesper

+0

Вероятно, вы не получите ответа, поскольку это могло быть решением просто для того, чтобы быть похожим на Java. Лично я предпочел бы, чтобы ключевое слово 'new' не существовало, и вы просто пишете' Foo() 'или' Foo.new() '. Возможно, это было рассмотрено в проекте Scala-Virtualized. Также см .: https://programmers.stackexchange.com/questions/47678/why-did-memory-managed-languages-like-java-javascript-and-c-retain-the-new –

ответ

6

Это было обсуждено некоторое время назад на scala-language mailing list.

Одерски указывает:

Одна из проблем, с уходом из new что неясности возникают для анонимных классов: Вместо

new Foo(x) { def y = x + x } 

вы получите:

Foo(x) { def y = x + x } 

Парсер отвергнет это, потому что он считает, что фигурные скобки {...} заключают аргумент функции, , поэтому определения не будут разрешены.

Я также хотел бы добавить, что у вас возникнут проблемы с конструкторами без параметров. Как

class Foo 

Как бы вы это описали, особенно если был объект-компаньон? Конечно, можно было бы сохранить new для этих случаев в качестве необязательного ключевого слова.

Более теоретическое отражение состоит в том, что в class Foo, Foo это не значение. В общем, вы не можете назвать какие-либо методы для типа, такие как синтетический apply() или гипотетический .new(). Для классов case apply определен на компаньонном объекте, который является значением. Тогда добавление синтетического apply к любому классу означало бы, что вы всегда получаете (синтетический) объект-компаньон для любого класса.

Было бы невозможно покончить с new. В экспериментальном проекте Scala-Virtualized вы найдете do have a virtual new. По такому же эстетическому вопросу можно было бы покончить с if и while и т. Д.