我有一个
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)
但是当“rader”中的“rad”因提取器返回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)
}
但那不会那么性感;) 谢谢
答案 0 :(得分:3)
因为您在分配给val
:
val radExtractor(duns,companyname,address,city,postal,_,orgnummer,_*)=rad
......比赛必须成功,否则您将遇到错误。上述语法在for-comprehension之外有效,Scala不为不匹配的情况提供任何特殊行为。
要在for-comprehension中过滤掉不匹配的值,请直接使用<-
左侧的模式:
val toReturn = for {
radExtractor(duns,companyname,address,city,postal,_,orgnummer,_*) <- rader
} yield Something(duns,companyname,address,city,postal,orgnummer)