2013-10-01 25 views
2
val i = Some(<foo/>) 
<bar>{for(o <- i) yield o}</bar> 

返回奇怪的值:選項[ELEM] Scala的XML

res3: scala.xml.Elem = <bar>Some(&lt;foo/&gt;)</bar> 

顯然不是預期的結果。 我可以寫繞開:

<bar>{for(o <- i.toList) yield o}</bar> 

返回預期的結果:

<bar><foor></foo></bar> 

可是爲什麼我需要做這種轉換?有什麼特點我應該投擲i,而不是將其轉換爲列表?

回答

4

因爲Option.map(這是你的,理解使用什麼)返回另一個Option,並且有從OptionSeq或類似的隱式轉換(其中的原因是值得商榷的,並進行了辯論)。雖然Option上有許多類似於集合的方法,但它實際上並未實現任何主要集合特徵,因此XML系統不知道將其視爲元素集合。

但是,barnesjd是正確的,你的理解是不需要的,你應該能夠將該選項轉換爲List或Seq並將其留在那。

scala> <bar>{i.toSeq}</bar> 
res2: scala.xml.Elem = <bar><foo/></bar> 
+0

那麼在那種情況下,我會拒絕我的,因爲它是有建設性的。 :) – joescii

2

表達式for(o <- i) yield o是一種無操作...也許這是你的意圖?

scala> for{ o <- i } yield { <bar>{o}</bar> } 
res3: Option[scala.xml.Elem] = Some(<bar><foo/></bar>) 
+0

更新我的問題來解釋我期待的回報。 –