Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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为什么允许从recoverWith返回_Scala - Fatal编程技术网

scala为什么允许从recoverWith返回

scala为什么允许从recoverWith返回,scala,Scala,我很惊讶scala允许从Try.recoverWith返回 例如,下面的代码很有意义,因为我正在使用Success scala> import scala.util.{Try,Success} import scala.util.{Try, Success} scala> def result: Option[Int] = Try(0/0).recoverWith { case _ => Success(-1) }.toOption result: Option[Int]

我很惊讶scala允许从
Try.recoverWith
返回

例如,下面的代码很有意义,因为我正在使用
Success

scala> import scala.util.{Try,Success}
import scala.util.{Try, Success}

scala> def result: Option[Int] = Try(0/0).recoverWith { case _ => Success(-1) }.toOption
result: Option[Int]

scala> result
res7: Option[Int] = Some(-1)
但至少对我来说,下面的返回代码没有任何意义。这甚至不起作用,因为toOption仍然返回
None
not
Some(-1)

为什么第二个示例在scala中甚至是有效的代码?因为recoverWith的定义正在返回
Try[U]

def recoverWith[U >: T](pf: PartialFunction[Throwable, Try[U]]): Try[U]
如果我删除
toOption
部分编译失败,这说明recoverWith和toOption之间存在某种差异

scala> def f = Try(0/0).recoverWith { case _ => return Some(-1) }
<console>:13: error: method applyOrElse has return statement; needs result type
       def f = Try(0/0).recoverWith { case _ => return Some(-1) }
                                                ^

您使用的是什么版本的scala?对我来说,第二个示例在scala 2.12.4I中生成:
Some(-1)
,在scala 2.12.5中也是如此。不知道recoverWith API代表什么。可能与2.12.4中修复的此问题有关。@XavierGuihot有趣的是,您提到的问题允许从collect函数中
返回None
。scala是否允许从代码库的任何地方返回最终类型?如果这是真的,那就太疯狂了。那么,使用函数返回类型有什么意义呢?您总是从一个命名的方法,
result
返回
。这是非本地返回,即例外。
scala> def f = Try(0/0).recoverWith { case _ => return Some(-1) }
<console>:13: error: method applyOrElse has return statement; needs result type
       def f = Try(0/0).recoverWith { case _ => return Some(-1) }
                                                ^
$ scala -version
Scala code runner version 2.12.3 -- Copyright 2002-2017, LAMP/EPFL and Lightbend, Inc.