gpt4 book ai didi

scala - 方法依赖性和错误处理

转载 作者:行者123 更新时间:2023-12-01 08:06:10 27 4
gpt4 key购买 nike

我正在 Lift 中制作一个小型问题管理系统,以学习 Scala 和 Lift。

我有一个 View ,显示属于项目的单个问题。在将数据绑定(bind)到 View 模板之前,我想检查是否拥有所需的所有数据,因此我想具体检查:

  • 已提供项目 ID 参数
  • 存在具有提供的项目 ID 的项目
  • 已提供问题 ID 参数
  • 所提供的问题 ID 存在问题

这些需要按顺序进行评估,所以如果我现在用我目前对 Scala 的理解来编写它,我会执行以下操作:

class Project {
def findByID(xhtml:NodeSeq): NodeSeq =
param("projectID") match {
case Full(projectID) =>
Project.findByID(projectID) match {
case Full(projectID) =>
param("issueID") match {
....
}
case _ => Text("Project does not exist")
}
case _ => Text("projectIDNotSupplied")
}
}

所以我想知道是否有更简单的方法来执行此操作?我认为 for 表达式可能能够执行类似的操作。请注意,Project.findByID 返回一个 Box[Project]。

最佳答案

抱歉,我来晚了,但正如丹尼尔所说,你确实可以使用 Lift's Box 和 ?~ 来做这样的事情。例如:

import net.liftweb.util.Box
import net.liftweb.util.Box._

class Project {
def findByID(xhtml:NodeSeq): NodeSeq =
(for {
projectID <- param("projectID") ?~ "projectIDNotSupplied"
project <- Project.findById(projectID) ?~ "Project does not exist"
issueID <- param("issueID") ?~ "issueIDNotSupplied"
...
} yield {
...
}) match {
case Full(n) => n
case Failure(msg, _, _) => Text(msg)
case _ => Text("fail")
}
}

什么 ?~ 的作用是将空框转换为带有给定字符串错误消息的失败框,但对满(成功)框不执行任何操作。因此,如果一切成功,findByID 的返回值将为 Full,否则返回 Failure(带有给定的错误消息)。如果你想要链接失败,那么使用 ?~!相反。

关于scala - 方法依赖性和错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1250957/

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