我希望节点test1,test2和test3仅在定义option
时出现。
下面的代码可行,但是,我不喜欢test1,因为它不使用模式匹配(所以我需要调用option.get
);我不喜欢test2,因为我有一条无用的行case _ =>
。而且我不喜欢test3,因为我有等效的.getOrElse(())
。有没有很好的方法来实现这个目标?
val option: Option[Int] = None
val node =
<test>
{ if (option.isDefined) <test1>{option.get}</test1> }
{ option match {
case Some(x) => <test2>{x}</test2>
case _ =>
}}
{ option.map(x => <test3>{x}</test3>).getOrElse(()) }
</test>
答案 0 :(得分:4)
怎么样
val node = <test> { option.iterator.map(x => <test1>x</test1>) } </test>
如果您将Option
转换为Iterator
,那么我认为您可以使用原生XML处理来获取您正在寻找的语义(也应该与toList
和其他人一起使用)。
答案 1 :(得分:0)
在忽略Some
的情况下,您似乎只关注None
案例:
def f(o: Option[Int]): scala.xml.Elem =
<test>
{
o match {
case Some(x) => <test1>{x}</test1><test2>{x}</test2><test3>{x}</test3>
case None => xml.NodeSeq.Empty
}
}
</test>