2011-04-24 14 views
5

en Ruby que podría tener esto:forma de Scala de llenar una plantilla?

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

Y cuando quiero "rendir" la plantilla, Me gustaría hacer esto:

rendered = string % ["[email protected]","Anderson"] 

y sería llenar el molde con los valores pasados ​​en la matriz ¿Hay alguna manera de hacer esto en Scala, aparte de usar el String.format de Java? Si escribo esto en Scala:

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

el XML resultante ya estaría "lleno". ¿Hay alguna manera de poder "adaptar" el XML?

Respuesta

11

Utilizando una función y XML de Scala:

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

y:

tmpl("[email protected]","Anderson") 

Un poco de azúcar:

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 % ("[email protected]","Anderson") 
1

Usted sólo puede utilizar una función para la que:

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

A diferencia de las cadenas de formato, esto le dará los beneficios de la tipada estática. Por ejemplo:

val ageXml = (age:Int) => <age>{age}</age> 
1

La respuesta aceptada es ideal para XML, pero para otras sintaxis me gusta scala-enhanced-strings plug-in de Johannes Rudolph.

Cuestiones relacionadas