2012-08-30 2 views
0

J'ai unScala pour la compréhension 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 
     } 
    } 
    } 

et je veux l'utiliser dans une compréhension de la liste comme:

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

Mais quand un « rad » dans « Rader » échoue parce que l'extracteur retourne None Je reçois un MatchError.

L'extracteur pour la compréhension n'est-il pas censé gérer/ignorer les cas None ou ai-je manqué quelque chose?

je pouvais faire

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

Mais ce ne serait pas aussi sexy;) Merci

Répondre

3

Parce que vous effectuez la correspondance de motif dans une affectation à un val:

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

... la correspondance doit aboutir, sinon vous rencontrerez une erreur. La syntaxe ci-dessus est valide en dehors d'une compréhension forcée et Scala ne fournit aucun comportement spécial pour les cas non-correspondants.

pour filtrer les valeurs qui ne correspondent pas à un pour-compréhension, utiliser le modèle directement à la gauche de la <-:

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