2012-08-30 130 views
0

我有一个斯卡拉理解unapplySeq

object radExtractor{ 
    def unapplySeq(row:HtmlTableRow):Option[List[String]]={ 
     val lista = (for{ 
     a<-row.getByXPath("td/span/a") 
     ah= a.asInstanceOf[DomNode] 
     if(ah.getFirstChild!=null) 
     } yield a.asInstanceOf[DomNode].getFirstChild.toString).toList 
     lista match{ 
     case Nil=>None 
     case l @ List(duns,companyname,address,city,postal,_bs,orgnummer, _*) =>Some(l) 
     case _ =>println("WTF");None 
     } 
    } 
    } 

,我想在一个列表理解一样使用它:

val toReturn = for{ 
     rad<-rader 
     val radExtractor(duns,companyname,address,city,postal,_,orgnummer,_*)=rad 
} yield Something(duns,companyname,address,city,postal,orgnummer) 

但是,当“拉德”的“雷德”失败,因为提取返回None我收到MatchError

是不是理解提取器应该处理/忽略None案件或我只是错过了什么?

我能做

val toReturn = rader.collect{case radExtractor(duns,companyname,address,city,postal,_,orgnummer, _*)=> 
      Something(companyname=companyname,address=address,city=city,postalcode=postal,orgnummer=orgnummer,duns=duns.toInt) 
} 

但是,这不会被视为性感;) 谢谢

回答

3

,因为你在分配进行模式匹配为val

val radExtractor(duns,companyname,address,city,postal,_,orgnummer,_*)=rad 

...比赛必须成功,否则你会遇到错误。上述语法在for-comprehension之外是有效的,Scala不会为非匹配的情况提供任何特殊行为。

要过滤掉非匹配值在一个换理解,直接使用图案到<-的左边:

val toReturn = for { 
    radExtractor(duns,companyname,address,city,postal,_,orgnummer,_*) <- rader 
} yield Something(duns,companyname,address,city,postal,orgnummer)