Scala 'if'语句的返回类型是什么
从Scala编程书中我读到,在下面的代码Scala 'if'语句的返回类型是什么,scala,Scala,从Scala编程书中我读到,在下面的代码configFilePath中,常量将是单元的类型: scala> val configFilePath = if (configFile.exists()) { | configFile.getAbsolutePath() | } configFilePath: Unit = () 但当我在REPL中执行此代码时,我得到类型为Any的结果。为什么? 书中的示例使用Scala 2.8,我使用Scala 2.10。一如既往,if语句计算逻辑条件并必须
configFilePath
中,常量将是单元的类型
:
scala> val configFilePath = if (configFile.exists()) {
| configFile.getAbsolutePath()
| }
configFilePath: Unit = ()
但当我在REPL中执行此代码时,我得到类型为Any
的结果。为什么?
书中的示例使用Scala 2.8,我使用Scala 2.10。一如既往,if语句计算逻辑条件并必须返回逻辑结果。因此:
scala.Boolean
。但该值不在每个字符的返回值中。评估结果将用于执行,但在执行过程中:
val configFilePath = if (configFile.exists()) {
configFile.getAbsolutePath();// say this returns a String.
};
但是如果configFile.exists()
返回false
,该怎么办?不会将任何内容放入该变量中,因此编译器将推断类型为Any
,这是有意义的,因为您没有提供任何方法来推断类型
另外,使用match
可能会更好
val configFilePath = configFile.exists match {
case true => Some { configFile.getAbsolutePath }
case false => None
};
以上是确定性的,应该返回一个选项[ReturnType]
,这是处理这类事情的默认Scala方式。if(cond){expr}
返回单位的公共基类型和expr的类型,就像if(cond){expr}else{()}
一样
它是Int
的AnyVal
,Char
等等,Unit
的Unit
和AnyRef的Any
:
scala> if ( false ) 1
res0: AnyVal = ()
scala> val r = if ( false ) { () }
r: Unit = ()
scala> if ( false ) ""
res1: Any = ()
if
语句采用语句/闭包/变量。使用闭包时,final语句用于推断类型。因为configFile.getAbsolutePath()
是一个对String
求值的函数。
单元
子类
任何
表示以下任一作品:
val configFilePath:Any = if (configFile.exists()) {configFile.getAbsolutePath()}
及
编辑
例如,情况可能是条件评估为false
val map = Map(1 -> "1")
val result = if(map.get(2)=="1") "Whoopie!"
这里的结果将是typeAny=()
,因为没有else
,值也没有
存在或该值不等于1
如果希望类型为String
val configFilePath = if (configFile.exists()) {configFile.getAbsolutePath()} else ""
是的,我明白。但为什么在我写的书中,返回类型将是Unit
,当我在REPL中执行此操作时,我会得到Any
?你认为这只是书中的打字错误吗?或者自Scala 2.8以来发生了一些变化(书籍使用Scala 2.8,我使用2.10)?回答得不错,我只是想添加configFile.getAbsolutePath()
的结果需要包装在Some()
中,以便返回类型为Option[String]
。否则,类型推断将采用String
和选项的公共超类型
,并再次返回Any
@MyTitle:2.8.2.final上的相同结果(Any
)。可能是关于运行时类型,而不是推断类型…configFile.getAbsolutePath()是一个计算到单元的函数
-它的计算结果是String
,我编辑了我的答案以反映其他可能性configFile.getAbsolutePath()
是一个函数,除非我遗漏了什么。它是一个方法,而不是函数。噢,如果
不是一个语句,它就是一个表达式。如果它是一个语句,它就不会有返回值,这就是“语句”的定义。谢谢@JörgWMittag非常有教育意义。它不是If
语句,而是If
表达式。如果它是一个语句,它就不会有返回类型,因为语句不会返回任何内容。
val configFilePath = if (configFile.exists()) {configFile.getAbsolutePath()} else ""