val i = Some(<foo/>)
<bar>{for(o <- i) yield o}</bar>
返回奇怪的值:
res3: scala.xml.Elem = <bar>Some(<foo/>)</bar>
显然不是预期的结果。 我可以写一下:
<bar>{for(o <- i.toList) yield o}</bar>
返回预期结果:
<bar><foor></foo></bar>
但为什么我需要进行此转换?是否有任何特征我应该i
,而不是将其转换为列表?
答案 0 :(得分:4)
因为Option.map
(这是您的理解所使用的)会返回另一个Option
,并且没有从Option
到Seq
或类似的隐式转换(原因)对此有争议,并一直在辩论)。虽然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>)