2

Scala 中浮点字面量的定义是

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.

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

scala> val x = .123
x: Double = 0.123

为什么它会这样?

4

1 回答 1

4

您粘贴的报价可能来自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。词法分析器识别它是 a Block,因此期望在不同的 s之间有 a semi(它是 a )。;BlockStat

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

scala> .123
res0: Double = 0.123
于 2020-10-12T06:56:03.533 回答