Snippetは終わったので、今回からAdvanced Example。
addressbook.scala | The Scala Programming Language
ScalaはXMLをリテラル(表現あってる?)として扱える。
文字列にする必要がない。
さらにXMLのリテラルの中にScalaコードを直接記述できる。
package sample.snippet object AddressBook { case class Person(name: String, age: Int) /** * An AddressBook takes a variable number of Arguments * which are accessed as Sequence */ class AddressBook(a: Person*) { private val people: List[Person] = a.toList def toXHTML = <table cellpadding="2" cellspaceing="0"> <tr> <th>Last Name</th> <th>First Name</th> </tr> { for (val p <- people) yield <tr> <td> { p.name } </td> <td> { p.age.toString } </td> </tr> } </table>; } /** * We introduce CSS using raw strings (between triple * quotes). Raw strings may contain newlines and special * characters (like \) are not interpreted. */ val header = <head> <title> { "My Address Book" } </title> <style type="text/css"> { """table { border-right: 1px solid #cccccc; } th { background-color: #cccccc; } td { border-left: 1px solid #acacac; } td { border-bottom; 1px solid #acacac;""" } </style> </head>; val people = new AddressBook ( Person("Tom", 20), Person("Bob", 22), Person("James", 19) ); val page = <html> { header } <body> { people toXHTML } </body> </html>; def main(args: Array[String]) { println(page getClass) println(page) } }
for文とかそのまま書いてるね。
あと、トリプルクォート。改行とか特殊文字(\とか)を含んだ文字列を作れる。
table〜tdまで1つの文字列。
実行結果。
class scala.xml.Elem <html> <head> <title> My Address Book </title> <style type="text/css"> table { border-right: 1px solid #cccccc; } th { background-color: #cccccc; } td { border-left: 1px solid #acacac; } td { border-bottom; 1px solid #acacac; </style> </head> <body> <table cellpadding="2" cellspaceing="0"> <tr> <th>Last Name</th> <th>First Name</th> </tr> <tr> <td> Tom </td> <td> 20 </td> </tr><tr> <td> Bob </td> <td> 22 </td> </tr><tr> <td> James </td> <td> 19 </td> </tr> </table> </body> </html>
XMLであるpageはscala.xml.Elemオブジェクトのようだ。