如何在Scala中突破或退出void方法?

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语句,但是如果有多个条件我想退出该方法并返回其调用者,那么这很快变得难以处理.

Art*_*ski 5

您需要从方法中指定单位返回类型

   def printPositiveNumbersSum(n1: Int, n2: Int): Unit = {
     if (n1 < 0 || n2 < 0)
       return
     println(n1 + n2)
   }
Run Code Online (Sandbox Code Playgroud)

然后它让scala编译器感到高兴.


wwk*_*udu 2

基本问题往往比看起来更有趣。有几种方法可以解决这个问题,可能值得考虑作为替代方案。但基础是,所有内容都会返回某种类型的值,并且编译器会尝试找出该类型是什么。在你的情况下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)