【发布时间】:2015-05-07 05:29:52
【问题描述】:
假设我有三个数据库访问函数foo、bar 和baz,它们都可以返回Option[A],其中A 是某个模型类,并且这些调用相互依赖。
我想按顺序调用函数,并且在每种情况下,如果找不到值,则返回相应的错误消息 (None)。
我当前的代码如下所示:
Input is a URL: /x/:xID/y/:yID/z/:zID
foo(xID) match {
case None => Left(s"$xID is not a valid id")
case Some(x) =>
bar(yID) match {
case None => Left(s"$yID is not a valid id")
case Some(y) =>
baz(zID) match {
case None => Left(s"$zID is not a valid id")
case Some(z) => Right(process(x, y, z))
}
}
}
可以看出,代码嵌套很糟糕。
如果相反,我使用for 理解,我无法给出具体的错误消息,因为我不知道哪一步失败了:
(for {
x <- foo(xID)
y <- bar(yID)
z <- baz(zID)
} yield {
Right(process(x, y, z))
}).getOrElse(Left("One of the IDs was invalid, but we do not know which one"))
如果我使用map 和getOrElse,我最终得到的代码几乎和第一个示例一样嵌套。
这些是一种更好的结构方式来避免嵌套,同时允许特定的错误消息吗?
【问题讨论】:
标签: scala nested option scala-cats