scala - Scala REPL 中的浮点文字错误

标签 scala floating-point literals read-eval-print-loop scala-repl

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

为什么会有这样的行为?

最佳答案

您粘贴的引用可能来自 Syntax Summary .

在回答您的问题之前,让我们注意以下事项:

scala> 1.213
res1: Double = 1.213

所以这里的问题不是 float ,而是表达式以点开头的事实。它使控制台就像常规 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,因此期望不同 BlockStat 之间有一个 semi(这是一个 ;) >s.

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

scala> .123
res0: Double = 0.123

关于scala - Scala REPL 中的浮点文字错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64308076/

相关文章:

scala - Scala 2.8 中是否有 do-until(后置条件)循环?

scala - 增量数据如何使用Spark

c++ - 警告 : format ‘%5f’ expects type ‘double’ , 但参数 3 的类型为 ‘int’

string - 将字符串缩小为字符串文字联合

c++ - 编写一个只接受文字 `0` 或文字 `1` 作为参数的函数

scala - 处理完成后 Akka Stop/Kill Actors

matlab - 为什么 24.0000 在 MATLAB 中不等于 24.0000?

c - 为什么 MSVS 不优化 +0?

c - (未)签名短整型 (C)

java - 如何为scala play框架项目编写Java TestNG测试类?