我很高兴在Scala中使用Option类型,而Lift Box[T]
也很棒。
但是,当它处于有效状态时,我对如何处理Empty感到困惑。
例如,我的程序有三个val:title
,startDate
和endDate
,title
和startDate
是必填字段,但是{{1}可能是空的。
现在,我希望从数据库中获取这些数据,因此我将它们包装到endDate
中,在下面的例子中,Box[T]
返回endDate
,这意味着在数据库中它是{{1} }}
现在我想在屏幕上打印这些数据,所以我有以下代码,但它不起作用,因为Empty
为空,所以理解的主体不会执行。
NULL
如果我将endDate
设为import net.liftweb.common._
object Main
{
val title: Box[String] = Full("title")
val startDate: Box[String] = Full("startDate")
val endDate: Box[String] = Empty
def main(args: Array[String]) {
for (title <- this.title; startDate <- this.startDate;
endDate <- this.endDate)
{
println("Title:" + title)
println("StartDate:" + startDate)
println("EndDate:" + endDate) // I hope now endDate = Empty or None
}
}
}
,它会正常工作,但我觉得它有点难看,因为endDate
应该足以表示Box[Option[String]]
是数据库中为NULL。
答案 0 :(得分:1)
最后,我提出了这个隐式转换和包装类:
class ValidEmptyBox[T](box: Box[T])
{
def validEmpty: Box[Box[T]] = box match {
case Full(x) => Full(Full(x))
case Empty => Full(Empty)
case Failure(msg, exception, chain) => Failure(msg, exception, chain)
}
}
object ValidEmptyBox {
implicit def toValidEmptyBox[T](box: Box[T]) = new ValidEmptyBox(box)
}
for(empty <- Empty.validEmpty) {
println(empty) // Empty
}
for(full <- Full("AA").validEmpty) {
println(full) // Full(AA)
}
for(fail <- Failure("Failure").validEmpty) {
println(fail) // No output
}
这似乎对我有用,但我仍然想知道是否有更好的方法来做到这一点。
答案 1 :(得分:1)
如果您想处理endDate
为Empty
的情况,则根本不提取它。
for (title <- this.title; startDate <- this.startDate) {
println("Title:" + title)
println("StartDate:" + startDate)
println("EndDate:" + this.endDate) // this.endDate == Empty
}
修改强>:
如果您要处理失败,只需添加match..case
或if
次测试。
this.endDate match {
case f: Failure =>
// handle failure
case endDate =>
for (title <- this.title; startDate <- this.startDate) {
println("Title:" + title)
println("StartDate:" + startDate)
println("EndDate:" + endDate) // endDate == Empty
}
}