Scala REPL中的浮点文字错误

问题描述

Scala中浮点文字的定义为

awk 'BEGIN{FPAT = "([^,]+)|(\"[^\"]+\")" && FS=OFS=","} (NR>1) && ($2!=""){$5=$2} 1' test.csv > output.csv 

当我尝试输入以点开头的浮点文字时,出现错误

floatingPointLiteral  ::=  digit {digit} ‘.’ digit {digit} [exponentPart] [floatType]
                        |  ‘.’ digit {digit} [exponentPart] [floatType]
                        |  digit {digit} exponentPart [floatType]
                        |  digit {digit} [exponentPart] floatType
exponentPart          ::=  (‘E’ | ‘e’) [‘+’ | ‘-’] digit {digit}
floatType             ::=  ‘F’ | ‘f’ | ‘D’ | ‘d’

如果将这样的文字分配给某个变量,一切都很好

scala> .123
        ^
   error: ';' expected but double literal found.

为什么会这样?

解决方法

您粘贴的报价可能来自Syntax Summary

在回答您的问题之前,请注意以下几点:

scala> 1.213
res1: Double = 1.213

因此,这里的问题不是浮点,而是表达式以点开头的事实。就像常规的Scala程序一样,它使控制台可以评估最后计算的对象上的表达式。

让我们举个例子:

scala> val d = 1.123
d: Double = 1.123

scala> .equals(1.123)
res10: Boolean = true

scala> .equals(1.123)
res11: Boolean = false

scala> .toString
res12: String = false

如您所见,每个新行都是前一行的后续。您可以返回,例如:

scala> res10
res13: Boolean = true

但是缓存中的对象是最后的结果。

在您的示例中,控制台的最后一次成功运行可能是val x = .123,它将最后的res设置为Double。当您运行.123时,您正在启动另一个BlockStat。词法分析器将其标识为Block,因此期望在不同的semi之间有一个;(这是BlockStat)。

启动新控制台时,它可以按预期工作:

scala> .123
res0: Double = 0.123