6 scala
这是一个非常基本的问题,但我似乎无法在任何地方找到答案.在没有返回值的Scala方法中,如何提前退出方法?
例如,
def printPositiveNumbersSum (n1: Int, n2: Int) = {
if (n1 < 0 || n2 < 0)
// How do I break out of this method here?
println(n1 + n2)
}
Run Code Online (Sandbox Code Playgroud)
尝试return在Java中使用like会引发一个printPositiveNumbersSum没有返回类型的错误.
我知道我可以将它作为if-else语句,但是如果有多个条件我想退出该方法并返回其调用者,那么这很快变得难以处理.
您需要从方法中指定单位返回类型
def printPositiveNumbersSum(n1: Int, n2: Int): Unit = {
if (n1 < 0 || n2 < 0)
return
println(n1 + n2)
}
Run Code Online (Sandbox Code Playgroud)
然后它让scala编译器感到高兴.
基本问题往往比看起来更有趣。有几种方法可以解决这个问题,可能值得考虑作为替代方案。但基础是,所有内容都会返回某种类型的值,并且编译器会尝试找出该类型是什么。在你的情况下printPostiveNumbersSum返回某种类型的东西。
Unit意味着一个函数或一段可执行代码。这个答案已经提到过。考虑返回 Option[Int] 作为总和。如果验证成功,则返回Some(sum),如果失败,则返回None。然后,调用者可以决定在失败的情况下做什么,也许使用一个match { case Some(sum)...构造。
def positiveNumbersSum (n1: Int, n2: Int): Option[Int] = {
if (n1 < 0 || n2 < 0)
None
else Some(n1 + n2)
}
Run Code Online (Sandbox Code Playgroud)但在更复杂的情况下,当您可能需要考虑更多规则时,返回失败原因None而不是仅仅返回. 在这种情况下,我觉得Either很方便。您可以指定两种返回类型。同样,调用者可以通过match { case Left(reason)... case Right(sum)...构造来区分。
def positiveNumbersSum (n1: Int, n2: Int): Either[String,Int] = {
if (n1 < 0 || n2 < 0)
Left("One of the numbers is negative")
else Right(n1 + n2)
}
Run Code Online (Sandbox Code Playgroud)