Почему scala оценивает псевдоним типа, когда он имеет разрыв строки и знак равенства отсутствует? - PullRequest
3 голосов
/ 25 февраля 2020

Я замечаю, что при объявлении псевдонима типа в REPL разрыв строки приводит к успешному выполнению оператора:

это работает:

scala> type a
     | 3 == 3
defined type alias a
res32: Boolean = true

Это не так:

scala> type a 3 == 3              ^
       error: `=`, `>:`, or `<:` expected

1 Ответ

6 голосов
/ 25 февраля 2020

Допустимо иметь абстрактный тип, как показано.

REPL находится в специальном режиме синтаксического анализа, где он знает, является ли текущая строка полным синтаксическим производством или если требуется больше ввода, поэтому переходит ко второй строке, хотя технически он должен просто принять type a.

scala> object X { type a }
defined object X

scala> object X { def x: Int }
                      ^
       error: only traits and abstract classes can have declared but undefined members

scala> type a
     | 42
defined type alias a
res0: Int = 42

scala> def x: Int
     | 42
           ^
       error: only traits and abstract classes can have declared but undefined members

. REPL не импортирует абстрактный typedef в текущее выражение, потому что знает, что он абстрактный.

Тип может быть не очень полезным, но это вещь:

scala> object X { type a }
defined object X

scala> val x: X.a = null.asInstanceOf[X.a]
x: X.a = null

scala> def x: X.a = ???
x: X.a

scala> def x: X.a = null
                    ^
       error: type mismatch;
        found   : Null(null)
        required: X.a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...