什么是`if`声明的返回类型(What is return type of `if` stateme

2019-09-02 05:50发布

从编程斯卡拉的书我读,在下面的代码configFilePath不变将是类型Unit

scala> val configFilePath = if (configFile.exists()) {
| configFile.getAbsolutePath()
| }
configFilePath: Unit = ()

但是,当我在REPL执行该代码我得到的类型的结果Any 。 为什么?

书中例子使用的Scala 2.8,我用Scala的2.10。

Answer 1:

if (cond) { expr }返回的公共基类型Unit和类型expr ,就像if (cond) { expr } else { () }

这是AnyValIntChar等, UnitUnitAnyAnyRef

scala> if ( false ) 1
res0: AnyVal = ()

scala> val r = if ( false ) { () }
r: Unit = ()

scala> if ( false ) ""
res1: Any = ()


Answer 2:

与往常一样,一个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的方式。



Answer 3:

if语句带有一个语句/关闭/变量。 使用时关闭,最后陈述被用来推断类型。 由于configFile.getAbsolutePath()是取值为函数StringUnit子类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 ""


文章来源: What is return type of `if` statement
标签: scala