Scala REPL中的浮点文本出错
Scala中浮点文字的定义是Scala REPL中的浮点文本出错,scala,floating-point,literals,read-eval-print-loop,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]
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> 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。lexer识别出它是一个块,因此需要一个半块,它是一个块;在不同的BlockStats之间
启动新控制台时,它会按预期工作:
scala> .123
res0: Double = 0.123
为什么您需要在Scala控制台中写入任何数字而不进行任何分配或返回?这个数字是没有意义的。或者使用菊石,这是更好的Scala REPL比香草REPL。它正确处理此情况。是否还需要数字{digit}'。[exponentPart][floatType]?123.e45是不允许的吗?