从编程斯卡拉的书我读,在下面的代码configFilePath
不变将是类型Unit
:
scala> val configFilePath = if (configFile.exists()) {
| configFile.getAbsolutePath()
| }
configFilePath: Unit = ()
但是,当我在REPL执行该代码我得到的类型的结果Any
。 为什么?
书中例子使用的Scala 2.8,我用Scala的2.10。
从编程斯卡拉的书我读,在下面的代码configFilePath
不变将是类型Unit
:
scala> val configFilePath = if (configFile.exists()) {
| configFile.getAbsolutePath()
| }
configFilePath: Unit = ()
但是,当我在REPL执行该代码我得到的类型的结果Any
。 为什么?
书中例子使用的Scala 2.8,我用Scala的2.10。
if (cond) { expr }
返回的公共基类型Unit
和类型expr
,就像if (cond) { expr } else { () }
。
这是AnyVal
的Int
, Char
等, Unit
对Unit
和Any
对AnyRef
:
scala> if ( false ) 1
res0: AnyVal = ()
scala> val r = if ( false ) { () }
r: Unit = ()
scala> if ( false ) ""
res1: Any = ()
与往常一样,一个if
语句计算逻辑条件,必须返回一个合乎逻辑的结果。 因此: scala.Boolean
。 但该值不是一个return
每说。 评价的结果在执行中使用,但你正在做它:
val configFilePath = if (configFile.exists()) {
configFile.getAbsolutePath();// say this returns a String.
};
但是,如果有什么configFile.exists()
返回false
? 没有什么会被放置到该变量,因此编译器将推出其类型Any
,因为您提供的没有办法断定这是有道理的type
。
此外,你可能关闭使用更好的match
。
val configFilePath = configFile.exists match {
case true => Some { configFile.getAbsolutePath }
case false => None
};
以上是确定性的,并且应该返回一个Option[ReturnType]
,这是处理这样的事情的默认Scala的方式。
该if
语句带有一个语句/关闭/变量。 使用时关闭,最后陈述被用来推断类型。 由于configFile.getAbsolutePath()
是取值为函数String
。 Unit
子类Any
含义以下任一作品:
val configFilePath:Any = if (configFile.exists()) {configFile.getAbsolutePath()}
和
val configFilePath:Unit = if (configFile.exists()) {configFile.getAbsolutePath()}
编辑
该情况可能是条件评估为假,例如
val map = Map(1 -> "1")
val result = if(map.get(2)=="1") "Whoopie!"
此结果将是键入Any = ()
因为没有else
和值不存在或值不等于1
这将是,如果你希望成为类型更合适的String
val configFilePath = if (configFile.exists()) {configFile.getAbsolutePath()} else ""