2013-04-21 59 views
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 _ => 

    } 

} 

它預計在收益率後的「情況」。 爲什麼?

以及如何以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("", ""); // <--- 

編譯器說,預計 「}」 只是之前產量

+2

['yield' is not''return'](http://stackoverflow.com/questions/1332574/common-programming-mistakes-for-scala-developers-to-avoid/1334822#1334822) – sschaef 2013-04-21 15:48:16

回答

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