2
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,而不是将其转换为 List ?

4

2 回答 2

4

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

但是,barnesjd 是正确的,不需要您的理解,您应该能够将 Option 转换为 List 或 Seq 并保留它。

scala> <bar>{i.toSeq}</bar>
res2: scala.xml.Elem = <bar><foo/></bar>
于 2013-10-01T21:39:04.393 回答
2

该表达式for(o <- i) yield o有点像无操作...也许这就是您的意图?

scala> for{ o <- i } yield { <bar>{o}</bar> }
res3: Option[scala.xml.Elem] = Some(<bar><foo/></bar>)
于 2013-10-01T21:26:33.640 回答