0

私は

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」が失敗するとNoneMatchError.

理解のためのエクストラクタは、ケースを処理/無視することになっていません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)
}

しかし、それはそれほどセクシーではありません;)ありがとう

4

1 に答える 1

3

への代入でパターンマッチを実行しているためval:

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

... 一致が成功しないと、エラーが発生します。上記の構文は for 内包表記の外側で有効であり、Scala は一致しないケースに対して特別な動作を提供しません。

for 内包表記で一致しない値を除外するには、 のすぐ左側にあるパターンを使用します<-

val toReturn = for {
  radExtractor(duns,companyname,address,city,postal,_,orgnummer,_*) <- rader
} yield Something(duns,companyname,address,city,postal,orgnummer)
于 2012-08-30T07:12:07.483 に答える