Scala XML中的选项[Elem]

时间:2013-10-01 21:17:57

标签: xml scala

val i = Some(<foo/>)
<bar>{for(o <- i) yield o}</bar>

返回奇怪的值:

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

显然不是预期的结果。 我可以写一下:

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

返回预期结果:

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

但为什么我需要进行此转换?是否有任何特征我应该i,而不是将其转换为列表?

2 个答案:

答案 0 :(得分:4)

因为Option.map(这是您的理解所使用的)会返回另一个Option,并且没有从OptionSeq或类似的隐式转换(原因)对此有争议,并一直在辩论)。虽然Option上有许多类似于集合的方法,但它实际上并没有实现任何主要集合特征,因此XML系统不知道将其视为元素集合。

然而,barnesjd是正确的,你不需要你的理解,你应该只能将选项转换为List或Seq并保留它。

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

答案 1 :(得分:2)

表达式for(o <- i) yield o有点像无操作......也许这就是你想要的?

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