Scala объект ничего не расширяет - PullRequest
5 голосов
/ 04 июля 2019

Я наткнулся на фрагмент кода в нашей кодовой базе, который выглядел для меня некорректным, но скомпилирован успешно и работал.

object Main extends {
  def main(args: Array[String]): Unit = {
    print("Hello World")
  }
}

Hello World

Может кто-нибудь объяснить мне, что здесь происходит?
Расширяется ли класс Main здесь анонимным class / trait?

Ответы [ 2 ]

8 голосов
/ 04 июля 2019

Если мы декомпилируем код, используя scala -Xprint:typer, мы видим, что Main extends AnyRef:

scalac -Xprint:typer Main.scala                                                                                               
[[syntax trees at end of                     typer]] // Main.scala
package com.yuvalitzchakov {
  object Main extends scala.AnyRef {
    def <init>(): com.yuvalitzchakov.Main.type = {
      Main.super.<init>();
      ()
    };
    def main(args: Array[String]): Unit = scala.Predef.print("Hello World")
  }
}

Это также задокументировано в спецификации Scala под определением объекта / класса:

Определение объекта определяет отдельный объект нового класса. Его наиболее общая форма object m extends t. Здесь m - это имя объекта, который нужно определить, а t - это шаблон формы

sc with mt1 with … with mtn { stats }, который определяет базовые классы, поведение и начальное состояние м. Предложение extends extends sc with mt1 with … with mtn может быть опущено, в этом случае расширяется scala.AnyRef. предполагается.

Этот синтаксис также действителен для ранних инициализаторов :

abstract class X {
  val name: String
  val size = name.size
}

class Y extends {
  val name = "class Y"
} with X
2 голосов
/ 04 июля 2019

Десугарс в

object Main extends Object

Вы можете проверить это, скомпилировав с scalac -print.

Грамматика состояний

ClassTemplateOpt  ::=  ‘extends’ ClassTemplate | [[‘extends’] TemplateBody]

, где

TemplateBody      ::=  [nl] ‘{’ [SelfType] TemplateStat {semi TemplateStat} ‘}’

так что, как я понимаю, он, по-видимому, будет определен как действительный, если мы рассмотрим [[‘extends’] TemplateBody].

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