«Новое» ключевое слово в Scala

У меня очень простой вопрос – когда мы должны применять новое ключевое слово при создании объектов в Scala? Это когда мы пытаемся создать экземпляр объектов Java?

Используйте new ключевое слово, если хотите обратиться к собственному конструктору class :

 class Foo { } val f = new Foo 

Опустите new если вы ссылаетесь на метод приложения сопутствующего объекта:

 class Foo { } object Foo { def apply() = new Foo } // Both of these are legal val f = Foo() val f2 = new Foo 

Если вы создали class case:

 case class Foo() 

Scala тайно создает для вас объект-компаньон, превращая его в это:

 class Foo { } object Foo { def apply() = new Foo } 

Таким образом, вы можете сделать

 f = Foo() 

Наконец, имейте в виду, что нет правила, которое говорит о том, что метод apply companion должен быть прокси для конструктора:

 class Foo { } object Foo { def apply() = 7 } // These do different things > println(new Foo) [email protected] > println(Foo()) 7 

И, поскольку вы упомянули classы Java: да – classы Java редко имеют объекты-компаньоны с методом apply , поэтому вы должны использовать new и фактический конструктор classа.

Это когда мы пытаемся создать экземпляр объектов Java?

Не за что. Существует два общих случая, когда вы опускаете new в scala. С объектами singleton (которые часто используются для хранения статических функций и как своего рода фабрика, аналогичная тому, что вы можете видеть в java):

 scala> object LonelyGuy { def mood = "sad" } defined module LonelyGuy scala> LonelyGuy res0: LonelyGuy.type = [email protected] scala> LonelyGuy.mood res4: java.lang.String = sad 

С classами case (фактически, под ним есть class + объект = сопутствующий шаблон, например, имеющий class и объект с тем же именем):

 scala> case class Foo(bar: String) defined class Foo scala> Foo("baz") res2: Foo = Foo(baz) 

Поэтому, когда вы работаете с простыми classами, правила такие же, как с Java.

 scala> class Foo(val bar: String) defined class Foo scala> new Foo("baz") res0: Foo = [email protected] // will be a error scala> Foo("baz") :8: error: not found: value Foo Foo("baz") 

Бонус, в scala есть анонимные classы, которые можно построить следующим образом:

 scala> new { val bar = "baz" } res2: java.lang.Object{val bar: java.lang.String} = [email protected] scala> res2.bar res3: java.lang.String = baz 
  • В чем разница между ключевыми словами «ref» и «out»?
  • Какова цель ключевого слова var и когда я должен использовать его (или опустить)?
  • Альтернатива инструкции goto в Java
  • Понимание скрытого в Scala
  • Когда мы должны использовать ключевое слово extern alias в C #?
  • Зарезервированное ключевое слово Gson Java
  • Разница ключевых слов «typename» и «class» в шаблонах?
  • Когда использовать статическое ключевое слово перед глобальными переменными?
  • Имеет ли ключевое слово «изменчивое» какие-либо цели, кроме возможности изменять переменную функцией const?
  • Что такое родное ключевое слово в Java?
  • Как заставить VS 2010 распознавать определенные функции CUDA
  • Давайте будем гением компьютера.