我编写了一个makeMsg函数,但我不喜欢它 - 它看起来真的非Scala-ish基于Option.isDefined进行区分.你能做得更好吗?
scala> def makeMsg(t: Option[String]) =
| if (t.isDefined) <msg text={t.get} /> else <msg />
makeMsg: (t: Option[String])scala.xml.Elem
scala> makeMsg(Some("hello"))
res0: scala.xml.Elem = <msg text="hello"></msg>
scala> makeMsg(None)
res1: scala.xml.Elem = <msg></msg>
Run Code Online (Sandbox Code Playgroud)
ten*_*shi 15
你可以试试这个:
def makeMsg(t: Option[String]) = <msg text={t orNull} />
Run Code Online (Sandbox Code Playgroud)
如果属性值是null- 它将不会添加到元素.
更好!如果您要添加此隐式转换:
import xml.Text
implicit def optStrToOptText(opt: Option[String]) = opt map Text
Run Code Online (Sandbox Code Playgroud)
你可以t像这样使用:
def makeMsg(t: Option[String]) = <msg text={t} />
Run Code Online (Sandbox Code Playgroud)
这是REPL会话:
scala> import xml.Text
import xml.Text
scala> implicit def optStrToOptText(opt: Option[String]) = opt map Text
optStrToOptText: (opt: Option[String])Option[scala.xml.Text]
scala> def makeMsg(t: Option[String]) = <msg text={t} />
makeMsg: (t: Option[String])scala.xml.Elem
scala> makeMsg(Some("hello"))
res1: scala.xml.Elem = <msg text="hello"></msg>
scala> makeMsg(None)
res2: scala.xml.Elem = <msg ></msg>
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为scala.xml.UnprefixedAttribute具有Option[Seq[Node]]作为值接受的构造函数.
| 归档时间: |
|
| 查看次数: |
3040 次 |
| 最近记录: |