【问题标题】:Error with floating point literal in Scala REPLScala REPL 中的浮点文字错误
【发布时间】:2020-10-11 19:17:27
【问题描述】:

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

为什么会这样?

【问题讨论】:

  • 为什么需要在 Scala 控制台中写入任意数字而无需任何赋值或返回?这个数字是没有办法的。
  • 或者使用 ammonite,这比 vanilla REPL 更好的 Scala REPL。它正确处理了这种情况。
  • 你也想要digit {digit} ‘.’ [exponentPart] [floatType]吗?不允许使用“123.e45”吗?

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


【解决方案1】:

您粘贴的引用可能来自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,因此期望在不同的BlockStats 之间存在semi(即;)。

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

scala> .123
res0: Double = 0.123

【讨论】:

    猜你喜欢
    • 2014-08-22
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多