Scala REPL 中的浮点文字错误
Error with floating point literal in 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
所以这里的问题不是浮点数,而是表达式以点开头的事实。它使控制台,就像一个普通的 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
(这是一个 ;
)。
启动新控制台时,它按预期工作:
scala> .123
res0: Double = 0.123
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
所以这里的问题不是浮点数,而是表达式以点开头的事实。它使控制台,就像一个普通的 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
(这是一个 ;
)。
启动新控制台时,它按预期工作:
scala> .123
res0: Double = 0.123