当前位置: 首页 > 知识库问答 >
问题:

如何在Scala中提前返回[副本]

令狐烨烨
2023-03-14

我现在正在学习Scala。我喜欢做的一件事是提前返回。我相信这对每个人来说都更容易理解,因为我们只是删除了之前的无效状态。现在,由于Scala是一种函数式语言,并且我读到了切割计算是糟糕的函数式风格,我想知道是否有一些技巧或函数式编程等同于早期返回。

这是我要写的代码,为了完全清楚,这只是一个愚蠢的例子,我不是在寻找我的特殊情况的特别黑客,但更多的是关于如何处理这些问题的一般建议。

if (request.headers.get(session_header).isEmpty) {
  BadRequest(session_not_set)
} else {
  Ok(CartHelper.getCart(session, user))
}

现在,我想做的是:

if (request.headers.get(session_header).isEmpty) {
  BadRequest(session_not_set)
  return;
}

Ok(CartHelper.getCart(session,user))

如果你有什么提示给我!

共有1个答案

越健
2023-03-14

在某些情况下,return关键字是无法避免的,但看起来您当前没有这个问题。

场景1:单条件场景,您当前的场景。在本例中,您可以避免使用非常简单的if else来使用return

def doSomething: AnyContent = {
  if (request.headers.get(session_header).isEmpty) {
    BadRequest(session_not_set)
  } else {
    Ok(CartHelper.getCart(session,user))
  }
}

如果会话未设置是一个常见的问题,您可以简单地使用部分函数在其周围设置一个保护。

def requireSession(req: Request)(
   pf: Session => AnyContent
): AnyContent = {
   request.headers.get(session_header)
     .fold(BadRequest("Session not set"))(pf(_))
}
// Assuming Play framework being used here
def getCart: AnyContent = Action { implicit req =>
  requireSession(req) { session => Ok(CartHelper.getCart(session, user) }
}

场景2:使用return的Break循环,或者所谓的早期return通常是一个性能改进元素。

在Scala中,return的一个明显有效的用法似乎是不可避免的,那就是您为某件事情的第一个迭代一个集合。显然,您可以使用collection.find和标准库中预构建的其他帮助器方法来抽象这些内容,但这是为了便于论证。

def inList[T](l: List[T], value: T): Boolean = {
  for (el <- l) {
    // break the loop for the first match found
    // for the sake of efficiency.
    if (el == value) return true;
  }
  false;
}

即使在这种情况下,通过使用不同的构造,return也是可以避免的,而且总有一些东西的递归版本可以用来替换dan迭代中显然不可能的return

 类似资料:
  • 问题内容: 我怎样才能返回一个 函数 副作用的词汇封闭 1 斯卡拉? 例如,我在Go中查看此代码示例: 打印1 2 3 5 8 而且我不知道如何在Scala中编写相同的内容。 1.在Apocalisp评论后更正 问题答案: 稍短一些,您不需要退货。

  • 我有一个返回[异常,字符串]的方法 } 现在我为类B和I存根方法验证编写测试 是否可以以这种方式存根以返回函数的右(......)?

  • 我正在努力使用它。绘制地图并等待。我如何让下面的内容等待地图完成?

  • 问题内容: 有什么方法可以追溯到Eclipse吗?基本上,当我按照执行流程(Ctrl +单击等)在一个大项目中跳来跳去时,有没有办法追溯步骤?如果我的代码调用一个方法,然后转到方法定义,是否有组合键可以将我带回到调用代码? 问题答案: 像在网络浏览器中一样按+ 和+ 。

  • 我有以下方法,用于返回Play for Scala应用程序中的字符串列表: } 代码不会编译并出现以下错误,因为如果 access = 0,则结果不是 Future: 类型不匹配;找到:play.api.mvc.Result要求:scala.concurrent.Future[play.api.mvc.Result] 如何解决这个问题?