gpt4 book ai didi

scala - 如何在 Scala 中提前返回

转载 作者:行者123 更新时间:2023-12-03 09:34:29 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Explicit return from play action

(2 个回答)


5年前关闭。




我现在正在学习 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))

如果你对我有什么提示!

最佳答案

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

场景一 :单一条件场景,您当前的场景。在这种情况下,您可以避免使用 return用一个非常简单的 if else .

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

如果未设置 session 是一个常见问题,您可以简单地使用部分功能对其进行保护。
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) }
}

场景二:使用 return 中断循环,或所谓的提前返回通常是性能改进元素。

一种明显有效的 return 用法在 Scala 中,这似乎是不可避免的情况,即您正在为第一个集合迭代集合。显然,您可以使用 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是可以避免的,通过使用不同的构造,并且总是有一个递归版本可以用来替换一个明显不可能的东西 return内丹迭代。

关于scala - 如何在 Scala 中提前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38833876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com