0

我有一个代码,它用产品解析来自 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 _ =>

     }

}

它期望在yield之后出现“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之前需要“}”

4

1 回答 1

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(...))

于 2013-04-21T15:54:59.747 回答