'match'范围内的scala yield期望'case'子句

时间:2013-04-21 15:13:49

标签: xml scala

我有一个代码可以解析来自xml的一些产品产品 ..有一个匹配的部分,并将结果放到产品 val:

 val products = 

  for (event <- reader) {    

     event match {

        case EvElemStart(_, "product", meta, _) =>

                  product = new Product()

                  product.title = meta("title").toString
                  product.description = meta("description").toString

        case EvElemEnd(_, "product") =>
                  yield product                  // <--

        case _ =>

     }

}

预计收益之后的“案例”。  为什么呢?

如何以scala方式完成?


另一次尝试:

val products =   

   for (event <- reader) {

          var title = "";
          var description = "";

          event match {

            case EvElemStart(_, "product", meta, _) =>

              title = meta("title").toString
              description = meta("title").toString

            case EvElemEnd(_, "product") =>

            case _ =>

          }

   }  yield new Product("", "");  // <---

编译器说它在 yield

之前预计会出现“}”

1 个答案:

答案 0 :(得分:2)

expr match case { ... }是一个表达式。它通常返回一个值,尽管它可以是Unit。在这种情况下,它更像是一种陈述。

for (...) yield {...}也是一种表达方式。在你的情况下,它将返回一个迭代器(因为reader是一个迭代器)。所以这会编译(虽然没有做你想要的):

for (event <- reader) yield {
  new Product("", "")
}

for {
  event <- reader
  product = new Product("", "")
} yield product

for {
  event <- reader
} yield {
  val product = new Product("", "")
  product
}

请注意,大括号可以替换为括号,这会更改分号/语句结尾的推断方式。通常,如果您需要多行,请使用大括号。

这也会编译:

for (event <- reader) yield {
  val product = event match {
     case EvElemStart(_, "product", meta, _) =>
       val title = meta("title").toString 
       val description = meta("title").toString
       Some(Product(title, description) // return some product 
     case _ =>
       None                             // return none
  }
  // product is a value of type Option[Product]
  product // last expression of a { ... } block will be the return value of block
}

它将返回一个迭代器,产生如下值:Some(Product(...)), None, None, Some(Product(...))