Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 'if'语句的返回类型是什么_Scala - Fatal编程技术网

Scala 'if'语句的返回类型是什么

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语句计算逻辑条件并必须

从Scala编程书中我读到,在下面的代码
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!"
这里的结果将是type
Any=()
,因为没有
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 ""