How do I add an XML attribute, or not, depending on an Option?

后端 未结 3 1130
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-31 08:28

I have written a makeMsg function but I don\'t like it - it just seems really un-Scala-ish to discriminate based on Option.isDefined. Can you make it better?



        
相关标签:
3条回答
  • 2020-12-31 08:44

    You can try this:

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

    if attribute value is null - it will not be added to the element.

    Update

    Even better! If you will add this implicit convertion:

    import xml.Text
    implicit def optStrToOptText(opt: Option[String]) = opt map Text
    

    you can just use t like this:

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

    Here is REPL session:

    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>
    

    This works because scala.xml.UnprefixedAttribute has constructor that accepts Option[Seq[Node]] as value.

    0 讨论(0)
  • 2020-12-31 08:45

    What's wrong with this:

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

    Not as concise as Easy Angel's, but it's straight up Scala.

    0 讨论(0)
  • 2020-12-31 08:55

    Canonical Scala that does not require the text field to know to cleverly disappear when it's empty:

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

    You should think about using this pattern whenever you have an option but need to use something that doesn't know about options. (In this case, Easy Angel has found a more compact solution where it does know about options or something like them.)

    0 讨论(0)
提交回复
热议问题