当Lift Box [T]具有空值时执行理解体

时间:2012-02-12 06:27:04

标签: scala lift

我很高兴在Scala中使用Option类型,而Lift Box[T]也很棒。

但是,当它处于有效状态时,我对如何处理Empty感到困惑。

例如,我的程序有三个val:titlestartDateendDatetitlestartDate是必填字段,但是{{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。

2 个答案:

答案 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)

如果您想处理endDateEmpty的情况,则根本不提取它。

for (title <- this.title; startDate <- this.startDate) {
  println("Title:" + title)
  println("StartDate:" + startDate)
  println("EndDate:" + this.endDate)   // this.endDate == Empty
}

修改

如果您要处理失败,只需添加match..caseif次测试。

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
    }
}