我有一个代码可以解析来自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
之前预计会出现“}”答案 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(...))
。