Как добавить атрибут XML или нет, в зависимости от параметра?
Я написал функцию makeMsg, но мне это не нравится - кажется, что это действительно не-w60 > -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>
Ответы
Ответ 1
Вы можете попробовать следующее:
def makeMsg(t: Option[String]) = <msg text={t orNull} />
если значение атрибута null
- оно не будет добавлено к элементу.
Update
Еще лучше! Если вы добавите это неявное преобразование:
import xml.Text
implicit def optStrToOptText(opt: Option[String]) = opt map Text
вы можете просто использовать t
следующим образом:
def makeMsg(t: Option[String]) = <msg text={t} />
Вот сеанс 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>
Это работает, потому что scala.xml.UnprefixedAttribute
имеет конструктор, который принимает Option[Seq[Node]]
как значение.
Ответ 2
Что не так с этим:
def makeMsg(t: Option[String]) = t match {
case Some(m) => <msg text={m} />
case None => <msg />
}
Не так лаконично, как Easy Angel, но он прямо вверх Scala.
Ответ 3
Canonical Scala, который не требует, чтобы текстовое поле знало, что он умно исчезает, когда он пуст:
t.map(s => <msg text={s} />).getOrElse(<msg />)
Вы должны подумать об использовании этого шаблона всякий раз, когда у вас есть опция, но вам нужно использовать что-то, что не знает о параметрах. (В этом случае Easy Angel нашел более компактное решение, где он знает о вариантах или что-то в этом роде.)