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

斯卡拉:要么,右,左

裴俊迈
2023-03-14

我是Scala的新手,目前正在尝试使用play框架。

这是我写的工作代码:

def authenticate = Action (BodyParsers.parse.json) { req =>
    req.body.validate[AuthenticationForm].map {form =>
        UserRepository.findByCredentials(form).map { user =>
            user.apiKeys.find(_.deviceId == form.deviceId).map { apiKey =>
                Ok(Json.toJson(apiKey))
            }.getOrElse({
                // HOW DO I TRANSFORM THIS INTO MORE BEAUTIFUL CODE
                val createdApiKey = ApiKeyRepository.create(new ApiKey(form.deviceId, form.deviceId))
                val userToWithNewApiKey = user.copy(apiKeys = user.apiKeys.:+(createdApiKey))
                UserRepository.update(userToWithNewApiKey)

                Ok(Json.toJson(createdApiKey))
            })
        }.getOrElse {
            Unauthorized
        }
    }.getOrElse {
        BadRequest
    }
}

嗯,这看起来不太好。我们能做得更好吗?我还不能。但我看到了stackoverflow的帖子:https://stackoverflow.com/a/24085333/3038183看起来很不错:)

现在我想知道如何转换我的代码,就像在给定的示例中一样。当然我已经试过了,但我无法让它编译,也不知道如何处理注释后的代码(“如何将其转换为更漂亮的代码”)。就我而言,我正在使用play。应用程序编程接口。mvc。结果,而不是上面链接中给出的“失败”。那么我的[play.api.mvc.Result,?WhatHere?]应该是什么类型的呢是

顺致敬意,

编辑:我接受了特拉维斯的回答。非常感谢。

对于任何对此感兴趣的人来说,我可以编写更好看的代码,这要感谢Travis:

def getApiKey(user: User, deviceId: String) : ApiKey = {
  user.apiKeys.find(_.deviceId == deviceId).getOrElse {
    val createdApiKey =
      ApiKeyRepository.create(new ApiKey(deviceId, deviceId))

    val userToWithNewApiKey =
      user.copy(apiKeys = user.apiKeys.:+(createdApiKey))

    UserRepository.update(userToWithNewApiKey)
    createdApiKey
  }
}

def authenticate = Action (BodyParsers.parse.json) { req =>
  (for {
    form <- req.body.validate[AuthenticationForm].asOpt.toRight(BadRequest).right
    user <- UserRepository.findByCredentials(form).toRight(Unauthorized).right
  } yield {
      Ok(Json.toJson(getApiKey(user, form.deviceId)))
  }).merge
}

共有1个答案

帅博远
2023-03-14

这是快速且未经测试的,但应该是一个不错的开始。首先,您可以使用toRight折叠一些嵌套,以获得[状态,?] <代码>或者不是一元的,而是它的右投影(我们可以使用<代码>得到)。右投影是。一旦不再可能出现故障,我们将使用屈服来处理结果。为了避免重复Ok(Json.toJson(key))部分,我稍微重写了你的apiKey。

def authenticate = Action (BodyParsers.parse.json) { req =>
  for {
    form <- req.body.asOpt.toRight[Status](BadRequest).right
    user <- UserRepository.findByCredentials(form).toRight[Status](
      Unauthorized
    ).right
  } yield {
    val apiKey = user.apiKeys.find(_.deviceId == form.deviceId).getOrElse {
      val createdApiKey =
        ApiKeyRepository.create(new ApiKey(form.deviceId, form.deviceId))

      val userToWithNewApiKey =
        user.copy(apiKeys = user.apiKeys.:+(createdApiKey))

      UserRepository.update(userToWithNewApiKey)
      createdApiKey
    }
    Ok(Json.toJson(apiKey)): Status
  }.e.merge
}

-理解的的最终结果(即除了.e.merge之外的所有内容)是一个Right投影[状态,状态]。我们将其转换回一个普通的旧要么[状态,状态]. e。此时我们不再需要跟踪失败和成功之间的区别,因此我们将整个事情转换为状态. mer

 类似资料:
  • 请看下面的代码,让我知道我哪里做错了? 使用: DSE版本-5.1.0 172.31.16.45:9042连接到测试群集。[cqlsh 5.0.1|Cassandra3.10.0.1652|DSE 5.1.0|CQL规范3.4.4|本地协议v4]使用HELP寻求帮助。 谢谢 斯卡拉 斯卡拉 斯卡拉 我在这里什么都得不到?甚至没有错误。

  • 我在eclipse中将scala项目转换为使用Maven(只需右键单击project并配置Maven build),这就创建了pom。xml,添加了正确的依赖项,它从maven存储库中提取了所需的JAR,但每当我尝试编译时,我都看不到在target\classes文件夹中生成类文件。然而,我在target\classes文件夹下的相应目录中看到了scala文件的实际源代码。我不确定它为什么要复制t

  • 基本上,我在cassandra上运行两个期货查询,然后我需要做一些计算并返回值(值的平均值)。 这是我的代码: 那么问题出在哪里呢? skus.foreach 在 ListBuffer 中追加结果值。由于一切都是异步的,当我尝试在我的主数据库中获取结果时,我得到了一个错误,说我不能被零除。 事实上,由于我的Sku.findSkusByProduct返回一个Future,当我尝试计算平均值时,卷是空

  • 我尝试使用I forest https://github.com/titicaca/spark-iforest,的scala实现,但是当我构建时(就像README中报告的< code>mvn clean package),它给我这些错误: 有人知道为什么吗?谢谢 scala版本2.11.12 火花版本2.4.0 maven版本3.5.2 我修改了pom.xml,调整了scala、spark和mav

  • 我试图将提供Id的馈线的值输入到。txt文件。他们有没有办法直接从feeder中提取值,而不必从每个会话中提取Id?

  • 我正在尝试使用ScalaTest和ScalaCheck进行基于属性的测试。我的测试概述如下: 现在我看到的是,如果我一遍又一遍地运行PropSpec1中的测试,有时第二个测试会通过,但大多数时候会失败。现在,如果0没有被b测试,那么很明显它会通过,但我认为这是它会一直尝试的事情之一。重复运行sbt clean test时,我看到了相同的行为;有时两项测试都通过了。 这对于基于属性的测试是正常的吗,