Как добавить атрибут XML или нет, в зависимости от варианта? - PullRequest
13 голосов
/ 24 января 2011

Я написал функцию makeMsg, но мне она не нравится - кажется, что она не очень удобна для распознавания на основе 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>

Ответы [ 3 ]

15 голосов
/ 24 января 2011

Вы можете попробовать это:

def makeMsg(t: Option[String]) = <msg text={t orNull} />

, если значение атрибута равно null - оно не будет добавлено к элементу.

Обновление

Еще лучше!Если вы добавите это неявное преобразование:

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]] в качестве значения.

4 голосов
/ 24 января 2011

Что не так с этим:

def makeMsg(t: Option[String]) = t match {
  case Some(m) => <msg text={m} />
  case None => <msg />
}

Не так кратко, как Easy Angel , но это прямо Scala.

1 голос
/ 24 января 2011

Каноническая Скала, для которой не требуется, чтобы текстовое поле умело исчезало, когда оно пустое:

t.map(s => <msg text={s} />).getOrElse(<msg />)

Вам следует подумать об использовании этого шаблона всякий раз, когда у вас есть опция, но вам нужно использовать что-то, что не знает об опциях. (В этом случае Easy Angel нашла более компактное решение, где она знает об опциях или о чем-то подобном.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...