如果语句Scala行为异常
如果 Scala 中的语句表现异常
scala> val a = 10
a: Int = 10
scala> if (a > 10) 1
res10: AnyVal = ()
scala> if (a <= 10) 1
res12: AnyVal = 1
为什么我们没有得到 Int 的返回类型?为什么我们得到 AnyVal
回答
如果 Scala 中的语句表现异常
Scala 没有if statement。事实上,Scala有没有报表在所有。Scala 有一个if 表达式,或者更准确地说,是一个条件表达式。
事实上,如果Scala有一个if语句,那么你的问题就没有意义,因为语句没有价值,因此没有类型。
为什么我们没有得到 Int 的返回类型?为什么我们得到 AnyVal
正如文档所说:
条件表达式
if(ë 1)ë 2elseë 3分选的值中的一个ë 2和ë 3取决于的值,ê 1。[…] 条件表达式的类型是e 2和e 3类型的弱最小上限。
这是有道理的:条件可以是真或假,所以条件表达式的值要么是“then”部分,要么是else部分。由于值可以是“then”部分或else部分,因此表达式的类型显然必须与两者兼容。
在你的情况下,“那么”部分的价值是1其类型是Int与价值else的部分是()它的类型是Unit:
条件表达式的简短形式消除了 else 部分。条件表达式
if(e 1)e 2被评估为好像它是if(e 1)e 2else()。
因此,无论整个表达式的类型是什么,它都必须与Int和兼容Unit。而最精确的可能的类型,它是兼容两者Int和Unit是AnyVal:[来源:Scala 2.13 语言规范 - 第 12 节Scala 标准库]
正如你可以在树的左半边看到,弱,LUBInt和Unit明显AnyVal。
- What a long way to say "you need an `else`" 😀
- "Scala has no statements at all."... well, this assertion is not very accurate. At least according to the Scala Spec -> https://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#statements