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

时间:2017-03-05 14:52:33

标签: scala ammonite

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中有错误?

2 个答案:

答案 0 :(得分:4)

该特定表达式在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文档中找不到任何内容,或者尝试一下,表明它支持此功能。也就是说,亚扪人不支持我上面粘贴的例子,这可能是做事情不那么混乱的方式。

答案 1 :(得分:2)

当您在常规Scala REPL中启动带有.的表达式时,它会尝试解释它,就像您尝试在先前的评估结果上调用方法一样。

因此,当您编写.3.+(5)时,REPL认为您的意思是resX.3.+(5),而resX是REPL返回的最后结果。

相关问题