我现在正在学习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
关键字是无法避免的,但看起来您当前没有这个问题。
场景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] 如何解决这个问题?