Скала способ заполнения шаблона? - PullRequest
5 голосов
/ 24 апреля 2011

В Ruby я мог бы иметь это:

string=<<EOTEMPLATE
<root>
  <hello>
     <to>%s</to>
     <message>welcome mr %s</message>
  </hello>
  ...
</root>
EOTEMPLATE

И когда я хочу «визуализировать» шаблон, я бы сделал это:

rendered = string % ["me@mail.com","Anderson"]

И он заполнит шаблон значениями, переданными в массиве. Есть ли способ сделать это в Scala, кроме использования Java String.format? Если я напишу это в Scala:

val myStr = <root>
<hello>
<to>{address}</to>
<message>{message}</message>
</hello>
</root>

результирующий XML уже будет «заполнен». Есть ли способ, которым я мог бы "шаблонизировать" XML?

Ответы [ 3 ]

11 голосов
/ 24 апреля 2011

Использование функции и Scala XML:

 val tmpl = {(address: String, message: String) =>
  <root>
    <hello>
      <to>{address}</to>
      <message>{message}</message>
    </hello>
  </root>
  }

и:

tmpl("me@mail.com","Anderson")

Немного сахара:

def tmpl(f: Product => Elem) = new {
   def %(args: Product) = f(args)
}

val t = tmpl{case (address, message) => 
  <root>
    <hello>
      <to>{address}</to>
      <message>{message}</message>
    </hello>
  </root>
}

t % ("me@mail.com","Anderson")
1 голос
/ 27 апреля 2011

Принятый ответ отлично подходит для XML, но для других синтаксисов мне нравится плагин scala-extended-strings Йоханнеса Рудольфа.

1 голос
/ 24 апреля 2011

Вы можете просто использовать функцию для этого:

val t = (s:String) => <someXML>{s}</someXML>

В отличие от форматных строк, это даст вам преимущества статической типизации. Например:

val ageXml = (age:Int) => <age>{age}</age>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...