为什么 scala REPL 和 Ammonite 在这一点上表现不同,哪种行为是正确的?

Why do scala REPL and Ammonite behave differently in this point and which behaviour is correct?

Scala 表达式

.3.+(5)
正如我所料,

在 Ammonite-REPL 中的结果为 5.3。但是,在 Scala REPL 中,它会产生语法错误,打印

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

直觉上,.3.+(5) 对我来说似乎是一个有效的表达方式。 Ammonite 中有错误还是 Scala REPL 中有错误?

当您在常规 Scala REPL 中以 . 开头的表达式时,它会尝试将其解释为就好像您尝试在先前的评估结果上调用方法一样。

所以当你写 .3.+(5) 时,REPL 认为你的意思是 resX.3.+(5)resX 是 REPL 返回的最后一个结果。

该特定表达式在 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 不支持我在上面粘贴的示例,这可能是一种不那么令人困惑的做事方式。