Scala 中内联函数内的 Return 关键字

Return keyword inside the inline function in Scala

提问人:sparkless 提问时间:1/25/2023 最后编辑:Dmytro Mitinsparkless 更新时间:1/25/2023 访问量:80

问:

我听说不要在 Scala 中使用 Return 关键字,因为它可能会改变程序的流程,例如;

// this will return only 2 because of return keyword
List(1, 2, 3).map(value => return value * 2) 

这是我的情况;我有递归案例类,并使用DFS对其进行一些计算。因此,最大深度可能是 5。这是模型;

case class Line(
    lines: Option[Seq[Line]],
    balls: Option[Seq[Ball]],
    op: Option[String]
)

我正在使用 DFS 方法来搜索这个递归模型。但在某些时候,如果数据中存在特殊值,我想停止遍历剩下的数据,而是直接返回结果。下面是一个示例;

Line(
  lines = Some(Seq(
     Line(None, Some(Seq(Ball(1), Ball(3))), Some("s")), 
     Line(None, Some(Seq(Ball(5), Ball(2))), Some("d")), 
     Line(None, Some(Seq(Ball(9))), None)
  )), 
  balls = None,
  None
)

在此数据中,如果我遇到 ,我想返回类似“NOT_OKAY”,这意味着我不再需要对 进行任何操作。否则,我将使用给定运算符对 each 应用计算。Ball(5)Ball(2) and Ball(9)Ball(x)

我正在使用这种DFS方法;

def calculate(line: Line) = {
   // string here is the actual result that I want, Boolean just keeps if there is a data that I don't want
   def dfs(line: Line): (String, Boolean) = {
     line.balls.map{_.map { ball =>
        val result = someCalculationOnBall(ball)
        // return keyword here because i don't want to iterate values left in the balls
        if (result == "NOTREQUIRED") return ("NOT_OKAY", true)
        ("OKAY", false)
      }}.getOrElse(
         line.lines.map{_.map{ subLine => 
            val groupResult = dfs(subLine)
            // here is I'm using return because I want to return the result directly instead of iterating the values left in the lines
            if (groupResult._2) return ("NOT_OKAY", true)
            ("OKAY", false)
         }}
      )
  }

  .... rest of the thing
}

在本例中,我在内联函数中使用 return 关键字,并完全更改了内部映射函数的行为。我刚刚读到一些关于在 Scala 中不使用关键字的内容,但无法确定这是否会产生问题。因为就我而言,如果我遇到一个我不想看到的值,我不想做任何计算。此外,我找不到摆脱返回关键字的功能方法。return

在这里使用return关键字是否有任何副作用,如堆栈异常等?我总是对其他方式持开放态度。非常感谢!

Scala 短路 停止、提前 返回

评论

1赞 anqit 1/25/2023
本文相关:tpolecat.github.io/2014/05/09/return.html
0赞 Dmytro Mitin 1/25/2023
你真的需要而不仅仅是吗?也就是说,在语义上与 ?Option[Seq[...]]Seq[...]Some(Nil)None

答: 暂无答案