2012-02-12 63 views
1

我很高兴在Scala中使用Option类型,Lift的Box[T]也很棒。当电梯箱[T]有空值时,理解机构执行

但我有点困惑与如何处理空当它是一个有效的状态。

例如,我的方案有三个丘壑:titlestartDateendDatetitlestartDate是必需的领域,但endDate可能是空的。

现在,我想从数据库中获得这些数据,所以我包他们到Box[T],并且在以下情况下,endDate返回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 
     } 
    } 
} 

如果我让endDateBox[Option[String]],它会工作得很好,但我觉得这是一个有点难看,因为Box[String]应足以来表示endDate是数据库NULL。

+0

我知道有''openOr(“”)''可以用,但我会想保持作为结束日期''Empty''或''None'',因为在某些情况下,空字符串有效并且不同于没有价值。 – 2012-02-12 06:32:16

+0

你有没有考虑从Box [T]到Option [T]创建隐式? – Destin 2012-02-12 06:57:37

回答

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

谢谢你的回答,但在这种情况下,它甚至会执行''endDate''是一个''Failure''。我希望它只能在endDate处于有效状态('Empty'或'Full')时执行。 – 2012-02-14 00:57:20

+0

增加了一个如何处理'Failure'的例子。我只是有点难过'Box'没有'isFailure'方法。 – leedm777 2012-02-14 05:46:41

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 
} 

这似乎为我工作,但我还是会想知道是否有更好的方法来做到这一点。