如何在 Scala 中提前返回[重复]

2023-11-21

我现在正在学习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:单一条件场景,您当前的场景。在这种情况下,您可以避免使用return用一个非常简单的if else.

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在 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内丹迭代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Scala 中提前返回[重复] 的相关文章

随机推荐

  • 如何修复滚动上的div [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 如果您向下滚动以下 URL 中的页面 共享 div 将锁定到浏览器 http knowyourmeme com memes pizza is a vegetable 我假设他们正在申请po
  • ASP.NET Core 3.1:共享本地化不适用于版本 3.1

    我可能没有在中进行正确的配置Startup cs文件 我创建了一个演示应用程序以使其正常工作 但在尝试了各种方法后 它无法正常工作 演示存储库可在以下链接中找到 https github com gurpreet42 MyAppV3 sta
  • 更改 NSTableViewCell 的颜色

    如何更改 NSTableView 中单元格的颜色 In your NSTableViewDelegate为了NSTableView 实现这个方法 void tableView NSTableView tableView willDispla
  • 使用 OAuth2.0 的客户端凭据流程进行 IMAP 身份验证失败 |爪哇 |在线交流

    我正面临着一个验证失败尝试使用客户端凭据授予流程连接两个 IMAP 协议时出现问题OAuth2 0 在哪里 我一直遵循微软在其分步指南中建议的步骤 即 使用 OAuth 验证 IMAP POP 或 SMTP 连接 我一直在使用这个githu
  • 在请求之间用 spring 维护状态

    我是 Spring 新手 如果这是初学者问题 很抱歉 但手册不清楚 至少对我来说不是 我的问题是 如何在 Spring 的请求之间共享状态 我可以使用 ModelMap 将数据从控制器发送到视图 但是 ModelMap 中的数据不会由视图发
  • 如何在 Eclipse 调试器中后退一步?

    是否可以在 Eclipse 调试器中进行反向执行 我当前正在进行的项目需要至少 5 秒的时间来读取和初始化文件中的数据 然后才能完成任何操作 如果我在调试器中越界 我必须终止程序并重新启动 这需要相当长的时间 您可以使用 Eclipse 的
  • 使用 Javascript 将 XML 转换为 JSON(以及反之)

    如何从 XML 转换为 JSON 然后再转换回 XML 以下工具运行良好 但并不完全一致 xml2json 以前有人遇到过这种情况吗 我认为这是最好的 XML 和 JSON 之间的转换 请务必阅读xml com O Reilly 网站上的随
  • 在“trap EXIT”中获取 shell 脚本的退出代码

    我想在我的 Bash 脚本中进行清理操作 如下所示 bin bash set eu trap echo E failed with exitcode 1 gt 2 ERR true false Using 我认为这是一个自然的选择 但事实并
  • 是否可以在构建过程中动态指定包名称?

    我想同时将调试和发布版本部署到我的设备 如果我在构建之前手动更改清单中的包名称 我可以做到这一点 例如改变
  • 在 Android 中禁用自定义键盘上的一键

    我有定制keyboard在我的 Android 应用程序中 它的布局在 xml 中描述如下
  • 查明 GWT 模块何时加载

    我通过以下方式将 GWT 方法导出到本机 javascript public class FaceBookGalleryEntryPoint implements EntryPoint Override public void onModu
  • 在 fp-ts 中链接一些异步任务,保留每个任务的结果

    在 fp ts 中 我尝试将一些可能失败的异步任务与TaskEither但我需要稍后使用中间任务的结果 在这个例子中 const getFoo a string Promise
  • Windows 10 上的 Laravel 8 和 Laravel Sail for dev 速度很慢。如何加快速度?

    我怎样才能重新创建这个 创建安装自Laravel 8 文档 and Laravel Sail 文档 我用sail up命令 效果很好 该命令构建 docker 容器 连接它们 并使开发变得像我们想象的那样简单 尤其是对于 VSCode 这工
  • 将元素与窗口底部对齐

    我正在尝试使用 jQuery 计算窗口高度 然后将该值应用于 DIV 容器 div 最后我希望 jQuery 将元素与页面底部对齐 div div Here is the element i wish to align to the bot
  • 如何解决重定向循环

    我有一个 Web 应用程序 一些使用 Chrome 作为首选浏览器的用户在注销应用程序并尝试重新登录时收到以下错误 此网页有重定向循环 我的 Web 应用程序使用表单身份验证 并且FormAuthenticationModule将用户重定向
  • 在 HTML 文件中使用 tern_for_vim 插件

    我正在尝试设置tern for vim插件可以在 JavaScript 中实现良好的自动完成功能 在编辑 js 文件时 Ctrl X Ctrl O 给出了很好的语义结果 拾取了 backbone js 和其他库 但是 当我在 HTML 文件
  • 如何以线程安全的方式迭代容器?

    我有一个容器 C 我需要从不同的线程以两种方式进行操作 1 添加和删除元素 2 遍历其成员 显然 在迭代发生时删除元素 灾难 代码看起来像这样 class A public void AddItem const T item int ind
  • Bash 内联命令的 Windows bat 替代品

    是否有任何 Windows 等效语法可以在 bat 脚本文件中的另一个命令中运行一个命令 在Linux中 您可以简单地使用 or 是的 至少对于简单的事情 setlocal enableextensions enabledelayedexp
  • 更改 SCNText 节点对象的颜色或纹理(Swift - Scenekit)

    如何设置 SCNText 对象的纹理 这就是我所拥有的 外观没有任何变化 myNode is a working SCNText element let mat SCNMaterial met diffuse contents UIImag
  • 如何在 Scala 中提前返回[重复]

    这个问题在这里已经有答案了 我现在正在学习Scala 我喜欢做的一件事是尽早返回 我相信这对每个人来说都更容易阅读 因为我们只是删除了之前的无效状态 现在 由于 Scala 是一种函数式语言 而且我读到削减计算是不好的函数式风格 我想知道是