Почему scala REPL и Ammonite ведут себя по-разному в этой точке и какое поведение является правильным?

Выражение Scala

.3.+(5)

оценивается как 5.3 в результате в Ammonite-REPL, как я и ожидал. Однако в Scala REPL возникает синтаксическая ошибка:

scala> .3.+(5)
<console>:1: error: ';' expected but double literal found.
       $intp.3.+(5)
            ^

Интуитивно, .3.+(5) кажется мне правильным выражением. Есть ли ошибка в Ammonite или в Scala REPL?


person spilot    schedule 05.03.2017    source источник


Ответы (2)


Это конкретное выражение не работает в Scala REPL, потому что у него есть функция, которая позволяет вам вызывать методы для последнего выражения, которое было выведено. Последнее выражение в вашем сеансе REPL должно иметь имя $intp. Эта функция обычно используется так:

scala> List(1, 2, 3, 4)
res14: List[Int] = List(1, 2, 3, 4)

scala> .map(_ + 1)
res15: List[Int] = List(2, 3, 4, 5)

В вашем случае Scala REPL думает, что вы пытаетесь вызвать метод с именем .3 на последнем выходе. Я не могу найти ничего в документации Ammonite или попробовать это, что предполагает, что он поддерживает эту функцию. То есть Ammonite не поддерживает пример, который я вставил выше, что, вероятно, является менее запутанным способом сделать что-то.

person Michael Zajac    schedule 05.03.2017

Когда вы начинаете выражение с . в обычном Scala REPL, оно пытается интерпретировать его так, как если бы вы пытались вызвать метод для предыдущего результата оценки.

Поэтому, когда вы пишете .3.+(5), REPL думает, что вы имели в виду resX.3.+(5), а resX - это то, что было последним результатом, возвращенным REPL.

person Jasper-M    schedule 05.03.2017